是孩子继承的setitimer()调用

时间:2019-04-18 12:50:16

标签: c linux timer fork setitimer

我正在编写一个代码分叉(3、5,...不确定的数字)。我希望我的程序在指定的时间后结束(父母先杀死自己的孩子,然后杀死自己,可能是通过调用_exit,它也是信号安全的)。我的意思是在信号处理程序中,我通过kill()杀死了整个子级,然后为所有调用callpid(),因为两者都是异步信号安全函数。为此,我在分叉之前使用setitimer(ITIMER_REAL, &timer, NULL

那么分叉的孩子会继承它吗?

如果它不是继承的,您可以显示一个源吗?

如果它是继承的,那么所有孩子都在花费时间后也结束了吗?另外,实际上我不希望这样。

1 个答案:

答案 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。