进程间通信-----信号
信号:进程间异步通知的机制。是一种在操作系统中用于进程间通信和控制的机制。它可以用于多种场景,例如进程间通信、异常处理、线程同步等。常见的信号有SIGINT(中断信号)、SIGTERM(终止信号)等。
三种常见的处理方式:
忽略:SIG_IGN
缺省:SIG_DFL
捕获:自定义方式处理
1、如果一个信号没有被注册,则按照缺省的方式处理
2、信号能早注册就早注册
alarm():闹钟
在指定秒数之后,发送一个信号(SIGALRM)
pause():挂起
让一个进程挂起(进入到S的状态),可被任意信号唤醒,这个信号必须要被捕获
sleep机制
#include<signal.h>
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
int a = 3;
void handler(int signo)
{
a--;
printf("chance %d\n",3-a);
if(0 == a)
{
exit(0);
}
alarm(3);
}
int main(void)
{
char buff[1024] = {0};
char *p;
signal(SIGALRM,handler);
while(1)
{
alarm(3);
fgets(buff,sizeof(buff),stdin);
//fflush(stdout);
a = 3;
}
return 0;
}
信号实例
#include<signal.h>
#include<stdio.h>
#include<unistd.h>
#include<sys/wait.h>
void handler(int signo)
{
int cnt = 3;
while(cnt > 0)
{
printf("child is doing homework\n");
cnt--;
sleep(1);
}
}
void call(int signo)
{
printf("child is callback\n");
wait(NULL);
}
int main(void)
{
pid_t pid = fork();
if(pid > 0)
{
int num = 8;
signal(17,call);
while(num > 0)
{
printf("father is working\n");
num--;
sleep(1);
}
kill(pid,10);
int cnt = 5;
while(cnt > 0)
{
printf("father is running\n");
cnt--;
sleep(1);
}
}else if(0 == pid)
{
int num = 10;
signal(10,handler);
while(num > 0)
{
printf("child is playing\n");
num--;
sleep(1);
}
pid_t fpid = getppid();
kill(fpid,17);
}else{
perror("fail fork");
}
return 0;
}