免费注册 查看新帖 |

Chinaunix

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

[Linux] [结贴]为什么prctl没有如我所预期的设置一个父进程退出发给子进程信号? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-01-18 15:55 |只看该作者 |倒序浏览
本帖最后由 centos_71 于 2015-01-18 19:34 编辑

我写了一个小程序,在fork出的子进程中使用prctl,设置父进程退出后自动发送给子进程退出信号。

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<unistd.h>
  4. #include<signal.h>
  5. #include<sys/prctl.h>
  6. int main()
  7. {
  8.   pid_t p = fork();
  9.   if(p==0)//father
  10.   {
  11.     printf("father\n");
  12.     getchar();
  13.     return 0;
  14.   }
  15.   else if(p<0)
  16.     exit(1);
  17.   
  18.   printf("child\n");
  19.   prctl(PR_SET_PDEATHSIG,0,0,0,0);
  20.   getchar();
  21.   return 0;
  22. }
复制代码
我预期的是,我运行程序以后,父进程和子进程都在getchar()阻塞。
我用ps看到父子两个进程

  1. [a@localhost ~]$ ps -ef|grep a.out
  2. a        13238  2727  0 02:41 pts/1    00:00:00 ./a.out
  3. a        13239 13238  0 02:41 pts/1    00:00:00 ./a.out
  4. a        13255 13240  0 02:42 pts/2    00:00:00 grep a.out
  5. [a@localhost ~]$ kill -9 13238
  6. [a@localhost ~]$ ps -ef|grep a.out
  7. a        13239     1  0 02:41 pts/1    00:00:00 ./a.out
  8. a        13257 13240  0 02:42 pts/2    00:00:00 grep a.out
复制代码
然后我杀死父进程(kill -9),我期待的是,子进程可以自动退出,因为子进程已经调用过prctl,能接收到父进程的通知对吧?
但是实际运行的结果,如上所示,子进程并没有退出,而是成了孤儿进城了。这是为什么呢?

为什么父进程退出以后,系统没有能通知子进程父进程已经退出了,然后子进程也退出?
可能我的程序或者理解有问题,还请高人指正,多谢!

论坛徽章:
0
2 [报告]
发表于 2015-01-18 19:07 |只看该作者
回复 1# centos_71
1.首先呢,父进程,子进程你貌似没有搞清楚 p==0 :子进程  p>0:父进程
2.prctl应该在子进程中调用,也就是说当父进程die,子进程收到prctl函数指定的信号,但是你似乎都设为了0.

根据你的代码进行了稍微的修改:
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<unistd.h>
  4. #include<signal.h>
  5. #include<sys/prctl.h>
  6. int main()
  7. {
  8.     pid_t p = fork();
  9.     if(p==0)//child process
  10.     {
  11.         printf("child\n");
  12.         prctl(PR_SET_PDEATHSIG,SIGKILL);
  13.         getchar();
  14.         return 0;
  15.     }
  16.     else if(p<0)
  17.         exit(1);

  18.     printf("parent\n");
  19.     getchar();
  20.     return 0;
  21. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2015-01-18 19:33 |只看该作者
嗯,我果然放了两个错误,pid==0是子进程,因为子进程可以getppid得到父进程id
另外就是prctl的第二个参数应该指定SIGKILL,我之前用了0,参数不对。

谢谢你的指正,现在的这个程序能如我所愿的工作了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP