免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1188 | 回复: 4
打印 上一主题 下一主题

看看关于unix 信号小程序的问题在哪? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-12-14 23:00 |只看该作者 |倒序浏览
我在unix sco5.05操作系统下编写的一段简单程序,但是执行结果让我很困惑,请指点:
#include      <signal.h>;
main()
{
   pid_t      pid;
   void        (*signal())();
   int            sig_child();
  
   signal(SIGUSR1,sig_child);
   if((pid=fork())==0)
      printf("child,pid[%d],ppid[%d]\n",getpid(),getppid());
   else
       kill(pid,SIGUSR1);
   
}
sig_child()
{
   printf("success\n";
   return(0);
}
用 cc aa.c 编译没报错;
执行a.out 结果为:child ,pid[1907],ppid[1906]

如果把kill(pid,SIGUSR1) 改为kill(getpid(),SIGUSR1),并且在父进程中打印
printf("childpid[%d]\n",pid);
程序的执行结果为:child,pid[1911],ppid[1910]
                             childpid[1911]
                              success
为什么?

论坛徽章:
0
2 [报告]
发表于 2004-12-15 08:22 |只看该作者

看看关于unix 信号小程序的问题在哪?

>;>;把kill(pid,SIGUSR1) 改为kill(getpid(),SIGUSR1)
这样就是父进程给自己发信号了

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
3 [报告]
发表于 2004-12-15 08:22 |只看该作者

看看关于unix 信号小程序的问题在哪?

第一次打印child ,pid[1907],ppid[1906] 是因为子进程比父进程更早地结束了,父进程发的SIGUSR1信号子进程收不到
第二次子进程打印child ,pid[1907],ppid[1906] 后结束,父进程打印childpid[1911] 后,将信号发给了自己(getpid()得到本进程的进程号),于是打印success
为什么不在子进程中加个延时呢?
if((pid=fork())==0) {
printf("child,pid[%d],ppid[%d]\n",getpid(),getppid());
sleep(5);
}
else
kill(pid,SIGUSR1);

论坛徽章:
0
4 [报告]
发表于 2004-12-15 09:36 |只看该作者

看看关于unix 信号小程序的问题在哪?

谢谢,成功了。另外我想问问,我如果取消kill函数,直接让子进程sleep(10)后,在程序结束前打印printf(pid[%],ppid[%d]\n",getpid(),getppid())后,子进程的ppid为1,这样应该是由于子进程在sleep时,父进程结束了,子进程被托管了造成的吧。

论坛徽章:
0
5 [报告]
发表于 2006-03-11 15:48 |只看该作者
没错!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP