进程的通信—信号量机制
编写一段程序,使用系统调用 fork( )创建两个子进程,再用系统调用 signal( )让父进程捕捉键盘上来的中断信号(即按 ctrl+c 键),当捕捉到中断信号后,父进程用系统调用 kill( )向两个子进程发出信号,子进程捕捉到信号后,分别输出下列信息后终止:
Child process 1 is killed by parent!
Child process 2 is killed by parent!
父进程等待两个子进程终止后,输出以下信息后终止:
Parent process is killed!
#include<sys/types.h> #include<sys/wait.h> #include<stdio.h> #include<unistd.h> #include<signal.h> #include<stdlib.h> int wait_mark; void stop(); void waiting(); int main() { int p1,p2; signal(SIGINT,stop); while((p1=fork())==-1); if(p1>0)//fork()第二次返回值为父进程的PID { while((p2=fork())==-1); if(p2>0)//父进程 { wait_mark=1; waiting(); kill(p1,10);//向p1发送信号 kill(p2,12); wait(NULL);//等待子进程运行结束 wait(NULL); printf("parent process is killed!\n"); exit(0); } else//子进程p2 { wait_mark=1; signal(12,stop); waiting(); lockf(1,1,0); printf("child process2 is killed!\n"); lockf(1,0,0); exit(0); } } else//子进程p1 { wait_mark=1; signal(10,stop); waiting(); lockf(1,1,0); printf("child process1 is killed!\n"); lockf(1,0,0); exit(0); } return 0; } void waiting() { while(wait_mark!=0); } void stop() { wait_mark=0; }
按下CTRL+C,如下:
代码分析
首先在父进程中进入waiting()中的死循环监听用户是否发来中断信号(这时子进程也在waiting()中等待),当监听到SIGINT信号,则调用stop(),wait_mark=0,退出循环,父进程向两个子进程发送10、12两个信号,然后等待子进程死亡,子进程受到信号后退出循环,执行后面的语句后,调用exit(0)撤销进程,父进程在处理僵尸进程后也撤销。

浙公网安备 33010602011771号