我正在编写一个代码分叉(3、5,...不确定的数字)。我希望我的程序在指定的时间后结束(父母先杀死自己的孩子,然后杀死自己,可能是通过调用_exit,它也是信号安全的)。我的意思是在信号处理程序中,我通过kill()杀死了整个子级,然后为所有调用callpid(),因为两者都是异步信号安全函数。为此,我在分叉之前使用setitimer(ITIMER_REAL, &timer, NULL
。
那么分叉的孩子会继承它吗?
如果它不是继承的,您可以显示一个源吗?
如果它是继承的,那么所有孩子都在花费时间后也结束了吗?另外,实际上我不希望这样。
答案 0 :(得分:1)
未继承。
POSIX spec for fork明确提到计时器是不继承的,并且XSI(timer_create
/ timer_settime
)计时器已重置:
- [XSI] [Option Start]间隔计时器应在子进程中重置。 [选项结束]
- 父级创建的按进程计时器不应被父级继承 子进程。
一个测试程序,例如:
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <signal.h>
#include <string.h>
#include <sys/time.h>
void h(int Sig)
{
char pid[20];
sprintf(pid,"%d\n",(int)getpid());
(void)write(1,pid,strlen(pid));
}
int main()
{
if(0>sigaction(SIGALRM,&(struct sigaction){.sa_handler=h},0)) return perror("sigaction"),1;
if(0>setitimer(ITIMER_REAL, &(struct itimerval){.it_value.tv_sec=1},0)) return perror("setitimer"),1;
pid_t ch; if(0>(ch=fork())) return perror("fork"),1;
pause();
if(ch){
sleep(1);
kill(ch,SIGTERM);
}
_exit(0);
}
显示处理程序仅在父级中运行-仅打印一个pid。