任务
一个进程(父进程)等待另一个死循环的进程(子进程)先结束并向自己BYEBYE后,自己再结束。
思路
父进程主动发送一个信号给子进程,子进程收到信号后开始准备结束。子进程中设置信号处理函数,提前结束自己,并向父进程“BYEBYE”.
流程图
代码
#include"stdio.h"
#include"unistd.h"
#include"signal.h"
#include"stdlib.h"
#include"wait.h"
void handle(int i){
printf("bye bye!\n");
exit(0);
}
int main(){
pid_t pid = fork();
if(pid == 0){
signal(SIGUSR1,handle);
while(1);
exit(0);
}
if(pid > 0){
kill(pid,SIGUSR1);
wait(NULL);
printf("father stop\n");
exit(0);
}
return 0;
}
总结
1.liunx中信号(signal)是进程间通信的机制,进程收到信号后会进行某种操作。
信号的发出可以由键盘中按键组合,某种命令,函数,硬件后者内核发出给进程。
Linux定义了64中信号,分别有不同的功能。程序员也可以自己编写信号处理函数来自定义某种信号的功能。
使用signal()函数注册信号处理函数。
2.使用kill()函数发送信号。
Kill函数可以设置接受信号的进程id,已经发送的信号。
3.wait()函数的功能是进程自己阻塞自己,直到该进程的子进程结束才被唤醒。
4.本题目的逻辑如上图所示。