免费注册 查看新帖 |

Chinaunix

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

[函数] 关于alarm的继承问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-12 16:11 |只看该作者 |倒序浏览
父进程调用alarm,不是timer_create,然后fork。时间到时,子进程会收到alarm信号吗?

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
2 [报告]
发表于 2008-11-12 16:38 |只看该作者

回复 #1 carl_lau 的帖子

The differences between the parent and child are

  The return value from fork

  The process IDs are different

  The two processes have different parent process IDs: the parent process ID of the child is the parent;  the parent process ID of the parent doesn't change

  The child's tms_utime, tms_stime, tms_cutime, and tms_cstime values are set to 0

  File locks set by the parent are not inherited by the child

  Pending alarms are cleared for the child

  The set of pending signals for the child is set to the empty set

论坛徽章:
0
3 [报告]
发表于 2008-11-12 16:45 |只看该作者

回复 #2 timespace 的帖子

这里的pending是产生了而还没有处理的信号吧,fork时还没有产生alarm信号呢,这个清空操作有用么。
还是我对pending的理解错了?

论坛徽章:
0
4 [报告]
发表于 2008-11-12 22:45 |只看该作者
当进程最早执行时,所有信号都重置为默认动作,除非父进程(执行新进程的那个)忽略某些信号,在这种情况下,新创建的进程也同样忽略这些信号。换一种说法,任何被父进程捕获的信号在子进程中都将被重置为默认动作,所有其它信号保持不变。由于新执行的进程没有共享父进程的地址空间,因此任何已注册的信号处理器都可能不存在。

进程执行的行为有一个值得注意的用法:当shell执行一个后台进程(或者当一个后台进程执行另一个后台进程时),新创建的进程应该忽略中断和退出信号。 因此,在shell执行一个后台进程之前,它应该设置SIGINT和SIGQUIT的动作为SIG_IGN。处理这两个信号的程序,首先检查信号是否被忽略。例如:
/* handle SIGINT, but only if it isn't ignored */
if (signal (SIGINT, SIG_IGN) != SIG_IGN) {
    if (signal (SIGINT, sigint_handler) == SIG_ERR)
        fprintf (stderr, "Failed to handle SIGINT!\n");
}
/* handle SIGQUIT, but only if it isn't ignored */
if (signal (SIGQUIT, SIG_IGN) != SIG_IGN) {
    if (signal (SIGQUIT, sigquit_handler) == SIG_ERR)
        fprintf (stderr, "Failed to handle SIGQUIT!\n");
}


仅仅fork()时信号的行为不一样。当进程调用fork()时,子进程继承父进程的信号,这同样也是有道理的,因为子进程和父进程共享地址空间,因此父进程的信号处理器在子进程中也存在。

论坛徽章:
0
5 [报告]
发表于 2008-11-12 23:53 |只看该作者
不会收到。
内核发送SIGALRM信号是以pid为依据的,子进程的pid与父进程不同...

论坛徽章:
0
6 [报告]
发表于 2008-11-13 10:34 |只看该作者

回复 #4 雨过白鹭洲 的帖子

多谢雨过白鹭洲的解答,关于信号处理器的观点我同意。
有点补充。fork之后,子进程还是继承父进程的信号处理方式,只有只有执行了某个exec函数后才会重置信号处理方式。好像在APUE中是这么说的。

论坛徽章:
0
7 [报告]
发表于 2008-11-13 10:35 |只看该作者

回复 #5 JohnBull 的帖子

谢谢5楼明确的答复!

论坛徽章:
0
8 [报告]
发表于 2008-11-13 23:12 |只看该作者
我觉得关键是
           The time left until an alarm clock signal is reset to 0 (clearing
           any pending alarm), and all interval timers are set to 0
           (disabled).
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP