当前位置: 技术问答>linux和unix
进程间signal问题
来源: 互联网 发布时间:2016-08-10
本文导语: #include #include #include #include int flag = 2; void sigchild(int signo) { flag = 1; } void hello(int sig) { flag = 0; } main() { pid_t p1, p2; int status; signal(SIGINT, hello); while((p1 = fork()) == -1); if(p1 > 0) { while((p2 = fork())...
#include
#include
#include
#include
int flag = 2;
void sigchild(int signo)
{
flag = 1;
}
void hello(int sig)
{
flag = 0;
}
main()
{
pid_t p1, p2;
int status;
signal(SIGINT, hello);
while((p1 = fork()) == -1);
if(p1 > 0)
{
while((p2 = fork()) == -1);
if(p2 == 0)
{
printf("Child process cn");
signal(17, sigchild);
if(flag == 1)
{
printf("child2 killed n");
}
//exit(0);
}
else
{
printf("Parent process an");
if(flag == 0){
kill(p1, 16);
kill(p2, 17);
}
wait(0);
wait(0);
printf("parent process is exitn");
}
}
else
{
printf("Child process bn");
signal(16, sigchild);
if(flag == 1)
{
printf("child1 killed n");
}
//exit(0);
}
}
创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号,当捕捉到中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出信息后终止:
为什么总是直接就退出了,wait(0);难道没起作用 么?
#include
#include
#include
int flag = 2;
void sigchild(int signo)
{
flag = 1;
}
void hello(int sig)
{
flag = 0;
}
main()
{
pid_t p1, p2;
int status;
signal(SIGINT, hello);
while((p1 = fork()) == -1);
if(p1 > 0)
{
while((p2 = fork()) == -1);
if(p2 == 0)
{
printf("Child process cn");
signal(17, sigchild);
if(flag == 1)
{
printf("child2 killed n");
}
//exit(0);
}
else
{
printf("Parent process an");
if(flag == 0){
kill(p1, 16);
kill(p2, 17);
}
wait(0);
wait(0);
printf("parent process is exitn");
}
}
else
{
printf("Child process bn");
signal(16, sigchild);
if(flag == 1)
{
printf("child1 killed n");
}
//exit(0);
}
}
创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号,当捕捉到中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出信息后终止:
为什么总是直接就退出了,wait(0);难道没起作用 么?
|
用waitpid吧
|
因为子进程没有等待父进程的信号,所以子进程能够很快就结束
因为子进程很快就结束了,所以wait也很快就返回
所以,在你按键前,父进程、子进程就已经结束了。
因为子进程很快就结束了,所以wait也很快就返回
所以,在你按键前,父进程、子进程就已经结束了。
#include
#include
#include
#include
int flag = 2;
void sigchild(int signo)
{
flag = 1;
}
void hello(int sig)
{
flag = 0;
}
main()
{
pid_t p1, p2;
int status;
signal(SIGINT, hello);
while((p1 = fork()) == -1);
if(p1 > 0)
{
while((p2 = fork()) == -1);
if(p2 == 0)
{
printf("Child process cn");
signal(17, sigchild);
//同另外一个进程的解释
if(flag == 1)
{
printf("child2 killed n");
}
//exit(0);
}
else
{
printf("Parent process an");
if(flag == 0){
kill(p1, 16);
kill(p2, 17);
}
wait(0); //由于在你按键前,子进程已经结束了,所以wait也很快返回。
wait(0); //同上
printf("parent process is exitn");
}
}
else
{
printf("Child process bn");
signal(16, sigchild);
if(flag == 1) //在父进程杀之前,应该忙等啊,
//由于时间太短,在你按键盘前,就已经执行到这了
//此时flag为2,不打印,子进程直接结束了。
{
printf("child1 killed n");
}
//exit(0);
}
}