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个值
这里用到了3号,即相应键盘的停止信号,ctr+(也可能是ctrl + c),和16,17号自定义信号
wait()函数
父进程处于阻塞状态,等待子进程终止,其返回值为所等待子进程的进程号
exit()函数
进程自我终止,释放所占资源,通知父进程可以删除自己,此时它的状态变为P_state= SZOMB,即僵死状态.如果调用进程在执行exit时其父进程正在等待它的中止,则父进程可立即得到该子进程的ID号
流程图
实现
#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;
}
结果
运行后若按下停止键,则
或者5秒后自动执行