实验目的
1、简单了解掌握软中断通信的定义知识。
2、了解什么是信号。
3、了解Linux系统环境下进程之间软中断通信的基本原理。
实验任务
(1)使用系统调用fork()创建两个子进程
(2)再用系统调用signal()让父进程捕捉键盘上发出的中断信号Ctrl+C
(3)当父进程接收到这两个软中断的某一个后,父进程用系统调用kill()向两个子进程分别发送软中断信号
(4)子进程捕捉到软中断信号,然后分别输出下列信息后终止:
Child process 1 is killed by parent !!
Child process 2 is killed by parent !!
(5)父进程调用wait()函数等待两个子进程终止后,输入以下信息,结束进程执行:
Parent process is killed!!
实验内容
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<signal.h>
#include<stdlib.h>
int wait_flag;
void stop();
int main()
{
int pid1,pid2;
signal(2,stop);
pause();
while((pid1 = fork())== -1);
if(pid1 > 0)
{
while((pid2 = fork()) == -1 );
if(pid2 > 0)
{
wait_flag= 1;
sleep(5);
kill(pid1, 16);
kill(pid2,17);
wait(0);
wait(0);
printf("\nparent process is killed!!\n");
exit(0);
}
else
{
wait_flag= 1;
signal(17,stop);
printf("\nchild process 2 is killed by parent!!\n");
exit(0);
}
}
else
{
wait_flag= 1;
signal(16,stop);
printf("\nchild process 1 is killed by parent!!\n");
}
}
void stop()
{
wait_flag = 0;
}
实验结果及分析
软中断通信1、系统调用kill(pid,sig)和signal(sig,func)被用来传递和接收软中断信号,进程号为pid的通过,signal(sig,func)捕捉到信号sig之后,执行预约的动作func,从而达到这两个进程的通信目的。
2、上述程序中,signal( )都放在一段程序的前面部位,而不是在其他接收信号处。这是因为signal( )的执行只是为进程指定信号值16或17的作用,以及分配相应的与stop( )过程链接的指针。因而,signal( )函数必须在程序前面部分执行。
3、先预设中断信号,创建子进程pid1、pid2,预设两个进程的中断信号,在按下Ctrl+C时,父进程向两个子进程发送中断信号,子进程捕捉到信号后输出相应信息,完成后终止,最后按Ctrl+C输出“parent process is killed!!”终止。
网友评论