linux进程的软中断通信

linux进程的软中断通信

要求

实现软中断通信的程序
使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上发出的中断信号(即按delete键),当父进程接收到这两个软中断的某一个后,父进程用系统调用kill()向两个子进程分别发出整数值为16和17软中断信号,子进程获得对应软中断信号,然后分别输出下列信息后终止:
Child process 1 is killed by parent !!
Child process 2 is killed by parent !!
父进程调用wait()函数等待两个子进程终止后,输入以下信息,结束进程执行:
Parent process is killed!!
多运行几次编写的程序,简略分析出现不同结果的原因。

相关函数

  • signal函数
    signal(sig,function): 捕捉中断信号sig后执行function规定的操作。
    头文件为:#include <signal.h>
    参数定义:signal(sig,function)
    int sig;
    void (*func) ();
    其中sig共有19个值

这里用到了3号,即相应键盘的停止信号,ctr+(也可能是ctrl + c),和16,17号自定义信号

  • wait()函数
    父进程处于阻塞状态,等待子进程终止,其返回值为所等待子进程的进程号

  • exit()函数
    进程自我终止,释放所占资源,通知父进程可以删除自己,此时它的状态变为P_state= SZOMB,即僵死状态.如果调用进程在执行exit时其父进程正在等待它的中止,则父进程可立即得到该子进程的ID号

流程图

实现

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include<sys/wait.h>
#include <unistd.h>
#include <sys/types.h>

int flag_wait=1;

void stop2()
{   
    flag_wait=0;
    printf("
son interruption
");
}
void stop()
{
    printf("
interruption
");
}

int main()
{
    pid_t pid1,pid2;
    signal(3,stop);

    while((pid1=fork())==-1);
    if(pid1>0)
    {
        while((pid2=fork())==-1);
        if(pid2>0)
        {
            sleep(5);
            kill(pid1,16);
            wait(0);
            kill(pid2,17);
            wait(0);
            printf("
Parent process is killed
");
            exit(0);
        }
        else
        {
            signal(17,stop2);
            while(flag_wait);
            printf("
child process 2 is killed
");
            exit(0);
        }
    }
    else
    {
        signal(16,stop2);
        while(flag_wait);
        printf("
child process 1 is killed
");
        exit(0);
    }
    return 0;
}

结果

运行后若按下停止键,则

或者5秒后自动执行

原文地址:https://www.cnblogs.com/yueshangzuo/p/8004876.html