linux进程的软中断通信del,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(sig,function)

int sig;

void (*func) ();

其中sig共有19个值

7c2bf85b60346dd018fa37f06b084b51.png

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

wait()函数

父进程处于阻塞状态,等待子进程终止,其返回值为所等待子进程的进程号

exit()函数

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

流程图

93cea5c9b841f7e4133793cf2f993cad.png

实现

#include

#include

#include

#include

#include

#include

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;

}

结果

运行后若按下停止键,则

9ef24298c9211dc44b679515ddafbef1.png

或者5秒后自动执行

52a2657aecc256dd9669fe2d67ed8eb9.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值