免费注册 查看新帖 |

Chinaunix

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

vfork之后再执行execl的子进程,为什么不能接收父进程的信号? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-02-29 15:12 |只看该作者 |倒序浏览
代码如下,子进程调用execl(),主程序调用kill()来给他发信号,但是它却不能接收信号,kill()函数返回0 ,errno返回13
#define EACCES  13      /* Permission denied                    */
  1. int main()
  2. {
  3. int     pid;
  4. int     stat;

  5. signal( SIGINT , SIG_DFL );
  6. signal( SIGHUP , SIG_DFL );

  7.     pid = vfork();
  8.     if( pid< 0 )
  9.     exit(0);
  10.     if( pid >; 0 )
  11.     {
  12.     sleep(5);
  13.         printf( "kill children\n" );
  14.         kill( pid , SIGHUP );
  15.         sleep(5);
  16.         printf( "parent kill self\n" );
  17.         exit(0);
  18.     }
  19. /*
  20.     setsid();
  21.     chdir("/");
  22.     umask(0);
  23.     if( setpgrp() < 0 )
  24.     {
  25.         return -1;
  26.     }
  27. */
  28.     execl( "/u/bin/program" , "program" , "33","1111" , (char *)0 );

  29.     exit(0);
  30. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2004-02-29 15:13 |只看该作者

vfork之后再执行execl的子进程,为什么不能接收父进程的信号?

如果子进程不调用execl函数,而是做别的事情,主程序就可以成功发送信号给子进程,子进程可以成功退出的

不知道有什么需要设置的??

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2004-03-01 09:56 |只看该作者

vfork之后再执行execl的子进程,为什么不能接收父进程的信号?

你调用execl后,这个进程和父进程已经没有父子关系了。
所以你没有权限去kill它。

论坛徽章:
0
4 [报告]
发表于 2004-03-01 12:05 |只看该作者

vfork之后再执行execl的子进程,为什么不能接收父进程的信号?

kill返回0代表成功了.
你没有处理SIGCHLD.

论坛徽章:
0
5 [报告]
发表于 2004-03-02 11:17 |只看该作者

vfork之后再执行execl的子进程,为什么不能接收父进程的信号?

好像和execl调用的程序有关!
同样是上面的程序,execl调用另一个程序(x.c 如下)就可以成功

x.c
  1. int main()

  2. {
  3.     while(1)
  4.     {
  5.         sleep(3);
  6.     }
  7. }
复制代码

论坛徽章:
0
6 [报告]
发表于 2004-03-02 11:23 |只看该作者

vfork之后再执行execl的子进程,为什么不能接收父进程的信号?

请问   “没有处理SIGCHLD” 是什么意思?
现在是父进程给子进程发信号,不是让父进程等待子进程退出!
这里SIGCHLD应该怎么处理?

论坛徽章:
0
7 [报告]
发表于 2004-03-02 13:07 |只看该作者

vfork之后再执行execl的子进程,为什么不能接收父进程的信号?

原帖由 "nxinvoodoo" 发表:
请问   “没有处理SIGCHLD” 是什么意思?
现在是父进程给子进程发信号,不是让父进程等待子进程退出!
这里SIGCHLD应该怎么处理?


你没让它退出不意味着它就不会退出.任何时候都应该处理SIGCHLD,哪怕是简单忽略.

不同进程对SIGHUP的响应动作不一定相同,SIGHUP的缺省行为是终结进程,但是后掉的命令可以不响应你的信号(比如忽略掉SIGHUP).

论坛徽章:
0
8 [报告]
发表于 2004-03-02 14:17 |只看该作者

vfork之后再执行execl的子进程,为什么不能接收父进程的信号?

父进程sleep(5)后  子进程已经执行完了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP