setitimer() 调用是否被 children 继承
Is setitimer() call inherited by children
我正在写代码分叉(数字 3、5、...不定数)。我希望我的程序在指定的时间后结束(parent 首先杀死它的 children,然后可能通过调用 _exit 杀死它自己,它也是 sig-safe)。我的意思是在信号处理程序中,我通过 kill() 杀死整个 children,然后为所有调用 waitpid(),因为两者都是 async-signal-safe 函数。为此,我在分叉之前使用 setitimer(ITIMER_REAL, &timer, NULL
。
那么它是被分叉的children继承的吗?
如果不是继承的,能给个出处吗?
如果是继承的话,是不是都children用完时间就结束了?另外,其实我不想要这个案子。
不继承。
POSIX spec for fork明确提到定时器不继承并且XSI(timer_create
/timer_settime
)定时器被重置:
- [XSI] [Option Start] Interval timers shall be reset in the child process. [Option End]
- Per-process timers created by the parent shall not be inherited by the
child process.
测试程序如:
#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。
我正在写代码分叉(数字 3、5、...不定数)。我希望我的程序在指定的时间后结束(parent 首先杀死它的 children,然后可能通过调用 _exit 杀死它自己,它也是 sig-safe)。我的意思是在信号处理程序中,我通过 kill() 杀死整个 children,然后为所有调用 waitpid(),因为两者都是 async-signal-safe 函数。为此,我在分叉之前使用 setitimer(ITIMER_REAL, &timer, NULL
。
那么它是被分叉的children继承的吗?
如果不是继承的,能给个出处吗?
如果是继承的话,是不是都children用完时间就结束了?另外,其实我不想要这个案子。
不继承。
POSIX spec for fork明确提到定时器不继承并且XSI(timer_create
/timer_settime
)定时器被重置:
- [XSI] [Option Start] Interval timers shall be reset in the child process. [Option End]
- Per-process timers created by the parent shall not be inherited by the child process.
测试程序如:
#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。