免费注册 查看新帖 |

Chinaunix

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

session leader终止时,哪些进程会收到SIGHUP? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-03-29 12:52 |只看该作者 |倒序浏览
《UNIX环境高级编程》第十章说:“如果对话期首进程(session leader)终止,则也产生SIGHUP。此信号被发送给该对话期前台进程组中的每一个进程。”

《UNIX网络编程》第一卷指出:把一个进程精灵化的过程是,先fork,父进程退出;之后在子进程中调用setsid创建一个新的对话期;第三步是“忽略SIGHUP信号并再次fork”。问题在于书上对第三步的解释是:“再次fork前,我们必须忽略SIGHUP,因为对话期首进程(也就是第一个子进程)结束时,该对话期中的全部进程都将收到SIGHUP信号。”

问题:对话期首进程结束时,到底是哪些进程会收到SIGHUP?是该对话期中的全部进程,还是该对话期前台进程组中的全部进程?

我在Solaris 5.8,g++ 3.3.2测试得到的结果是,

  1. void
  2. handle_hup(int signo) {
  3.         char info2[100];
  4.         snprintf(info2, 100, "Process %d received SIGHUP.\n", getpid());
  5.         write(STDOUT_FILENO, info2, strlen(info2));
  6.         return;
  7. }

  8. int
  9. daemonize() {
  10.         // step 1: fork() and let the parent terminate.
  11.         pid_t pid = 0;
  12.         if ((pid = fork()) >; 0) { // the parent
  13.                 _exit(0);
  14.         }

  15.         // step 2: setsid() to create a new session.
  16.         setsid();

  17.         // step 3: catch SIGHUP and fork() again
  18.         struct sigaction newact, oact;
  19.         newact.sa_handler = handle_hup;
  20.         sigemptyset(&newact.sa_mask);
  21.         sigaction(SIGHUP, &newact, &oact);

  22.         if ((pid = fork()) >; 0) { // the 1st child, a session leader
  23.                 pause();
  24.                 _exit(0);
  25.         }

  26.         if ((pid = fork()) >; 0) { // the 2nd child
  27.                 pause();
  28.                 _exit(0);
  29.         }

  30.         // the 3rd child. Make a new process group in the same session.
  31.         setpgid(0, 0);

  32.         if ((pid = fork()) >; 0) { // the 3rd child, a process group leader
  33.                 pause();
  34.                 _exit(0);
  35.         }

  36.         // the 4th child
  37.         pause();
  38.         return 0;
  39. }

  40. int
  41. main() {
  42.         daemonize();
  43.         return 0;
  44. }

  45. $ a.out
  46. $ ps -ejl | grep a.out
  47. 8 S 203327  4486  4485  4485  4485  0  51 20        ?    219        ? ?
  48. 0:00 a.out
  49. 8 S 203327  4488  4487  4487  4485  0  41 20        ?    219        ? ?
  50. 0:00 a.out
  51. 8 S 203327  4487  4486  4487  4485  0  51 20        ?    219        ? ?
  52. 0:00 a.out
  53. 8 S 203327  4485     1  4485  4485  0  51 20        ?    219        ? ?
  54. 0:00 a.out
  55. $ kill -INT 4485
  56. $ r ps
  57. ps -ejl | grep a.out
  58. 8 S 203327  4486     1  4485  4485  0  51 20        ?    219        ? ?
  59. 0:00 a.out
  60. 8 S 203327  4488  4487  4487  4485  0  41 20        ?    219        ? ?
  61. 0:00 a.out
  62. 8 S 203327  4487  4486  4487  4485  0  51 20        ?    219        ? ?
  63. 0:00 a.out
  64. $
复制代码

运行结果证明该对话期的两个进程组中,剩下的全部三个进程,在对话期首进程被终止的时候,都没有收到SIGHUP信号。为了证明我们的SIGHUP handler是有效的,我们继续:

  1. $ kill -HUP 4487
  2. Process 4487 received SIGHUP.
  3. $ r ps
  4. ps -ejl | grep a.out
  5. 8 S 203327  4486     1  4485  4485  0  51 20        ?    219        ? ?
  6. 0:00 a.out
  7. 8 S 203327  4488     1  4487  4485  0  41 20        ?    219        ? ?
  8. 0:00 a.out
  9. $
复制代码

求教高人,问题到底出在哪里?SIGHUP到底什么时候被发送,给哪些进程?

论坛徽章:
0
2 [报告]
发表于 2005-03-30 09:32 |只看该作者

session leader终止时,哪些进程会收到SIGHUP?

都没有人看到的吗?只好自己给翻上来,继续等待高手指点……

论坛徽章:
0
3 [报告]
发表于 2007-08-02 20:03 |只看该作者

帮顶!!

顶!!

论坛徽章:
0
4 [报告]
发表于 2007-09-24 23:30 |只看该作者
可能是前台进程组,你setsid以后,对话期是没有控制终端的,所以也就没有前台进程组,因此即使session leader终止,也不会收到SIGHUP信号的。
你应该在别的系统上试试,可能就是发给所有对话期进程的

[ 本帖最后由 lanying_wzw 于 2007-9-29 00:33 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-09-28 21:43 |只看该作者
对话期首进程结束了,如果导致此对话期的某个进程组成为孤儿进程组,且有进程停止的话,会向此进程组发送SIGHUP信号的

论坛徽章:
0
6 [报告]
发表于 2007-09-29 13:50 |只看该作者
别的大虾不发表下意见吗?

论坛徽章:
0
7 [报告]
发表于 2008-06-14 22:29 |只看该作者
继续顶,发现CU的人对终端了解的太少!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP