1

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

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

如果它不是继承的,你能提供一个来源吗?

如果它是继承的,那么所有的孩子都会在时间结束后结束吗?另外,其实我不想要这个案子。

4

1 回答 1

1

不继承。

fork的POSIX 规范明确提到计时器不是继承的并且 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。

于 2019-04-18T13:07:25.500 回答