2、编写一段程序,使用系统调用函数fork( )创建两个子进程,再用系统调用函数signal( )让父进程捕捉信号SIGINT(用kill命令来触发),当捕捉到中断信号后,父进程用系统调用函数kill( )向两个子进程发出信号,子进程捕捉到父进程发来的信号后,分别输出下列信息后终止:
Child process 1 is killed by parent!
Child process 2 is killed by parent!
或者
Child process 2 is killed by parent!
Child process 1 is killed by parent!
父进程等待两个子进程终止后,输出以下信息后终止:
Parent process exit!
//代码如下
#include <signal.h>
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
//定义全局变量,否则子进程id号传不进函数
pid_t pid1,pid2;
//父进程接受信号后向子进程发信号
void fun(int sig)
{
kill(pid1,SIGUSR1);
kill(pid2,SIGUSR2);
}
//子进程1接收信号后打印
void fun1(int sig)
{
printf("Child1 process1 is killed by parent!\n");
}
//子进程2接收信号后打印
void fun2(int sig)
{
printf("Child2 process2 is killed by parent!\n");
}
int main(int argc(),char *argv[])
{
//产生第一个子进程1
pid1 = fork();
//父进程接受信号和继续产生一个子进程
if(pid1 > 0)
{
pid2 = fork();
//父进程
if(pid2 > 0)
{
signal(SIGINT,fun);
wait(NULL);
wait(NULL);
printf("Parent process exit!\n");
}
//子进程2接收信号
if(pid2 == 0)
{
signal(SIGUSR2,fun2);
pause();
}
}
//子进程1接收信号
if(pid1 == 0)
{
signal(SIGUSR1,fun1);
pause();
}
return 0;
}
通过ps -ef查询到父进程id号,在终端通过kill命令向父进程发送信号
运行结果:
总结:
本题有几个点需要注意:
一是不能使用循环来产生子进程,否则不能得到子进程的ID号,就无法使用kill()函数来发送信号
二是接收子进程的变量要定义为全局变量,因为signal函数(void (*signal(int sig, void (*func)(int)))(int);)中的第二个参数是关联的自定义函数,而这个函数的参数除了信号不能是其他形参,也不可以自己定义,所以需要使用全局变量。
//还在学习中,如有错误,欢迎指出