当前位置:  技术问答>linux和unix

请教关于Kill向子进程发送信号的问题,子进程如何相应信号,为什么子进程接受不到。

    来源: 互联网  发布时间:2015-12-16

    本文导语:  一个上机题目说,一个父进程创建两个子进程,父进程相应ctrl+c信号后,向两个子进程发送信号,子进程接收到信号后,分别打印一条输出语句,然后输出。 我写的程序,除了用SIGKILL和SIGSTOP信号,子进程可以收到,...

一个上机题目说,一个父进程创建两个子进程,父进程相应ctrl+c信号后,向两个子进程发送信号,子进程接收到信号后,分别打印一条输出语句,然后输出。
我写的程序,除了用SIGKILL和SIGSTOP信号,子进程可以收到,别的信号子进程收不到。但是SIGKILL和SIGSTOP收到后,不会去执行我注册的处理函数,直接就是退出或者停止,这是为什么,下面是我写的程序。
#include 
#include 
#include 
#include 

pid_t tchild1 = 0,tchild2 = 0;

void killchild()
{
printf("Kill Child Proc %x %xn",tchild1,tchild2);
kill(tchild1,SIGKILL);
kill(tchild2,SIGKILL);
}

void child1()
{
printf("Child1 is killed by parentn");
exit(0);
}

void child2()
{
printf("Child2 is killed by parentn");
exit(0);
}

main()
{
int i;

tchild1 = fork(); //create the first process
if(tchild1 == -1)
{
printf("Create New Process Failedn");
}
else if(tchild1 == 0)
{
//the first child process
printf("This New Process Created by PID %xn",getppid());

signal(SIGKILL,child1);

while(1);

}
else
{
printf("Create New Process Successful!New PID %xn",tchild1);
tchild2 = fork(); //create the second process
if(tchild2 == -1)
{
printf("Create New Process2 Failedn");
}
else if(tchild2 == 0)
{
//the second child process
printf("This New Process2 Created by PID %xn",getppid());

signal(SIGKILL,child2);
while(1);

}
else
{
printf("Create New Process2 Successful!New PID %xn",tchild2);
signal(SIGINT,killchild);
wait();
printf("child kill okn");
}
}
}

|
理论上没问题,但中间的细节很复杂,我给找出两点,你对信号的用法有点毛病。

1.用signal函数不好,它不是可移植的(在不同的平台有不同的语义,像restart特性),用sigaction代替。
2.信号处理函数应该尽可能的精简,绝对不要调用C io库(比如printf)或系统调用(比如exit)。原因很简单,
    a) 当信号到达,系统会中止当前进程代码执行,转入信号处理函数,这时进程本来可能正处在非常脆弱的阶段,比如指令执行中间。长时的io调用和系统调用会引起不可恢复的数据错误。
    b) 信号处理函数本身可能被其他的信号中断,而且被信号中断是不可恢复的。除非你屏蔽了该信号。长时的io调用和系统调用增加了被中断的可能性。

所以一般在信号处理函数中都只应该做能够让你知道有信号发生这么一件事就行了,比如为一个原子化变量赋值 flag=1; (flag为全局 sig_atomic型)
*nix信号实现都是这样的,如果你想移植,最好按标准的办法来(也许现代OS像linux可以处理上面的问题,但我不能确定)。

你的这个具体问题表面上看没有问题,但由于while(1);会疯狂掠夺CPU时间片,再加上你使用了不可靠的信号处理方式,导致整个程序运行结果都不可预期(可能性太多)。
如果你把 while(1);行改为 while(1) usleep(200); 好像是可以的。

|
但是SIGKILL和SIGSTOP收到后,不会去执行我注册的处理函数,直接就是退出或者停止,这是为什么
===========================
SIGKILL , SIGSTOP不能被捕获

|
SIGKILL 和 SIGSTOP 是不能被捕获和忽略的

|
SIGUSR1和SIGUSR2是怎么定义的???

|
我试了一下,把
kill(tchild1,SIGUSR1);
kill(tchild2,SIGUSR2);
放到主进程里,就可以.放到信号处理函数里就不行.还不知道为什么.

你的信号处理函数的原型应该是这样:
void sig_handle(int signo);

    
 
 

您可能感兴趣的文章:

  • 高手请教!linux怎样通过pid获取进程信息,如:进程名、进程状态等?
  • 请教,进程通讯问题,除了父子进程能进行通讯外,任意两个进程都可以吗?
  • 请教--父进程监控子进程,欢迎高手进来探讨!!!
  • 请教一个关于子进程和父进程竞争的问题
  • 请教急:shell怎么实现进程监控,重启进程
  • 请教如何编程实现父进程产生多个子进程
  • 请教:进程创建和进程状态有关问题
  • 请教:在Linux下怎么样检测一个进程是否是僵尸进程??
  • 小妹请教各位大哥,在unix下,如何显示进程,和kill掉进程?
  • Linux下请教一个父进程杀死子进程的问题.
  • 各位大侠,请教一个LINUX存储管理的问题,在页换出时系统要锁住正在被换出的进程,若系统不锁住该进程,会发生什么状况?
  • 请教一个多进程编程问题
  • 请教怎么根据进程输出的日记文件内容判断来重起进程?
  • 请教:子进程关闭
  • 请教进程问题
  • 请教LINUX下建立子进程的问题(急急急)!!!
  • 请教一个父子进程控制的问题
  • 请教进程与变量的问题
  • 请教进程通信
  • 请教,请教,,,一定要看!!一定要看!! iis7站长之家
  • 请教:多线程模式下的信号处理问题
  • 请教信号量处理函数signal的问题?
  • 请教 gtk编程,nootbook控件切换标签时信号量处理的问题
  • linux编程中简单的信号处理问题,请教各位,谢谢。
  • 请教一个关于UNIX下信号量的问题
  • 信号方面的问题请教.请大家指点
  • 初学,请教一个信号问题,这个方法不理解
  • 请教一段代码的意思,信号和超时的
  • [请教内核高手]内核在何处处理接收到的信号
  • 请教一个有关信号的问题
  • 还是不懂,驱动到底如何能同步的发送信号给用户程序,请教高人,谢谢了
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请教 spandsp 发送多页传真的问题
  • 请教一个局域网内邮件发送的问题
  • 请教发送ARP的问题
  • 如何通过其他网站发送短消息(比如新浪)?JSP页面提交,高分请教!!
  • 请教发送email的问题
  • 高分请教,电子邮件的发送时间问题
  • 请教 javamail 在 linux 上发送邮件
  • 高分请教:为什么配置好的sendmail不支持分割发送MAIL???
  • 请教,socket中recv不能一次完全接收send发送的字节数?
  • 请教,linux内核协议栈中,从内核往驱动发送的报文(注意是下行,不是上行),如何从sk_buff判断是组播数据报文还是组播协议报文????
  • ¥¥:-)给分请教:linux下的邮件发送日志是什么文件??我是用php的mail()函数的。急盼!各位仁兄请帮忙!!
  • 请教一个msg发送程序的问题
  • 真正请教:Serializable接口有哪些主要作用,为什么它与Socket类可实现邮件发送?在概念或原理上是如何实现的呢?
  • 向高手请教(至少200分)一个局域网内发送以太帧的问题
  • 高分请教:可以在局网中跨代理发送email是什么意思?
  • 高手请教socket 发送信息被合并
  • linux新手,请教各位大人串口通讯问题(发送十六进制正常,接受数据错误)附源码
  • 请教,请教,这个问题是为什么????
  • 请教本地硬盘安装问题请教本地硬盘安装问题
  • ■请教■请教redhat最基本的问题!
  • 请教一个 shell 问题,我用下面这个 shell 语句总是失败,请教
  • 高分请教,各位大侠,请教一个问题,理论高手请进??谢谢
  • 请教Linux下pgadmin3-1.0.2的编译和安装!!高分请教!
  • 各位大虾,请教装了REDHAT9操作系统后,启动时无法引导到LINUX,请教该如何解决啊
  • 请教,请教,,,一定要看!!一定要看!!
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • :请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教象我这样的硬盘应如何安装Linux,我昨天试装了,但有问题。(老问题了,也看了前面的帖子,但还是来请教,请多指教)
  • 请教这种循环的执行过程
  • 请教两个redhat9问题
  • 请教如何在指定目录下查找包含指定文字的文件


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3