Является ли вызов setitimer () унаследованным от детей - PullRequest
1 голос
/ 18 апреля 2019

Я пишу код разветвления (число 3, 5, ... неопределенное число). Я хочу, чтобы моя программа заканчивалась после указанного времени (родительский объект сначала убивает своих потомков, а потом сам, вероятно, вызывая _exit, что также безопасно для sig). Я имею в виду, что в обработчике сигналов я убиваю целых детей с помощью kill (), а затем вызываю waitpid () для всех, так как оба являются своего рода функцией, безопасной для асинхронного сигнала. Для этого я использую setitimer(ITIMER_REAL, &timer, NULL перед разветвлением.

Так это наследуется раздвоенными детьми?

Если это не наследуется, не могли бы вы показать источник?

Если это наследуется, все ли дети заканчиваются и после истечения времени? Кроме того, на самом деле я не хочу дела.

1 Ответ

1 голос
/ 18 апреля 2019

Не наследуется.

В спецификации POSIX для fork явно упоминается, что таймеры не наследуются и что таймеры XSI (timer_create / timer_settime)сброс:

  • [XSI] [Option Start] Таймеры интервала должны сбрасываться в дочернем процессе.[Option End]
  • Таймеры для процесса, созданные родительским процессом, не должны наследоваться дочерним процессом.

Тестовая программа, подобная:

#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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...