LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1102|回复: 5

问一个linux下关于kill()与singal的使用问题:

[复制链接]
发表于 2005-4-28 18:24:49 | 显示全部楼层 |阅读模式
#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void waiting( ),stop( );
int wait_mark;
main( )
{
int p2;
while((p2=fork( ))= =-1);     /*创建子进程*/
if(p2>0)
{
                    wait_mark=1;
signal(SIGINT,stop);   /*接收到^c信号,转stop*/
waiting( );
kill(p2,17);        /*向p2发软中断信号17*/
wait(0);           /*同步*/
printf("arent process is killed!\n");
exit(0);
}
           else
             {
                    wait_mark=1;
signal(17,stop);   /*接收到软中断信号17,转stop*/
waiting( );
printf("Child process 2 is killed by parent!\n");
exit(0);
}

   }

void waiting( )
{
while(wait_mark!=0);
}

void stop( )
{
wait_mark=0;
}


为什么运行后只有父进程输出Parent process is killed!
预期的应该是子进程先输出,然后才是父进程啊~~~
  不懂啊,应该怎么改进啊
 楼主| 发表于 2005-4-28 18:28:59 | 显示全部楼层

问一个linux下关于kill()与singal的使用问题:

--------------------------------------------------------------------------------


#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void waiting( ),stop( );
int wait_mark;
main( )
{
int p2;
while((p2=fork( ))= =-1); /*创建子进程*/
if(p2>0)
{
wait_mark=1;
signal(SIGINT,stop); /*接收到^c信号,转stop*/
waiting( );
kill(p2,17); /*向p2发软中断信号17*/
wait(0); /*同步*/
printf("arent process is killed!\n");
exit(0);
}
else
{
wait_mark=1;
signal(17,stop); /*接收到软中断信号17,转stop*/
waiting( );
printf("Child process 2 is killed by parent!\n");
exit(0);
}

}

void waiting( )
{
while(wait_mark!=0);
}

void stop( )
{
wait_mark=0;
}


为什么运行后只有父进程输出Parent process is killed!
预期的应该是子进程先输出,然后才是父进程啊~~~
不懂啊,应该怎么改进啊
回复 支持 反对

使用道具 举报

发表于 2005-4-28 21:51:27 | 显示全部楼层
这是什么程序呀? :ask
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-28 22:39:23 | 显示全部楼层
Post by DSL
这是什么程序呀? :ask


是在linux下编的c程序,目的是:
使用系统调用fork()创建两个子进程,再调用系统调用signal()让父进程捕捉键盘上来的中断信号当捕捉到中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:
                Child processl1 is killed by parent!
                Child processl2 is killed by parent!

父进程等待两个子进程终止后,输出如下的信息后终止:
                Parent process is killed!
回复 支持 反对

使用道具 举报

发表于 2005-4-28 23:34:20 | 显示全部楼层
Post by li3000
是在linux下编的c程序,目的是:
使用系统调用fork()创建两个子进程,再调用系统调用signal()让父进程捕捉键盘上来的中断信号当捕捉到中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:
                Child processl1 is killed by parent!
                Child processl2 is killed by parent!

父进程等待两个子进程终止后,输出如下的信息后终止:
                Parent process is killed!

去程序设计版问
回复 支持 反对

使用道具 举报

发表于 2005-4-29 10:48:22 | 显示全部楼层
程序没有问题。
关键是执行时,不要在终端上按Ctrl+c来发出信号。而要用ps命令查看到父进程的pid后,再用kill命令向父进程发出SIGINT信号。
在终端上按Ctrl+c时,shell会向同一进程组的所有进程发送SIGINT,由于子进程中没有忽略SIGINT,所以子进程结束了。
在子进程中设置signal(2, SIG_IGN),也可以直到同样的作用。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表