我正在编写代码分叉(数字 3、5、...不定数(。我希望我的程序在指定的时间后结束(父级首先杀死它的孩子,然后可能通过调用_exit,这也是sig安全的(。我的意思是在信号处理程序中,我通过 kill(( 杀死整个孩子,然后对所有孩子调用 waitpid((,因为两者都是一种异步信号安全函数。为此,我在分叉之前使用setitimer(ITIMER_REAL, &timer, NULL
。
那么它是由分叉的孩子遗传的吗?
如果它不是继承的,你能显示一个来源吗?
如果是遗传的,那么所有的孩子在花时间后是否也会结束?此外,实际上我不想要这种情况。
未继承。
分叉的POSIX规范明确提到计时器不是继承的,XSI(timer_create
/timer_settime
(计时器被重置:
- [XSI] [选项开始] 间隔计时器应在子进程中重置。[选项结束]
- 父进程创建的每进程计时器不应由 子进程。
测试程序如下:
#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,"%dn",(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。