进程的通信—信号量机制

编写一段程序,使用系统调用 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,退出循环,父进程向两个子进程发送1012两个信号,然后等待子进程死亡,子进程受到信号后退出循环,执行后面的语句后,调用exit(0)撤销进程,父进程在处理僵尸进程后也撤销。

 

 

posted @ 2017-11-03 21:22  奇热行  阅读(460)  评论(0)    收藏  举报