Можно ли дождаться дочернего процесса внутри обработчика функции сигнала? - PullRequest
0 голосов
/ 15 марта 2020

Я узнал, что сигнал может появляться в любом месте при запуске своего кода. Например, этот код:

pid_t child;

void cleanup(int signal) {
 int status;
 while (waitpid((pid_t) (-1), 0, WNOHANG) > 0) {}
}

int main() {
   // Register signal handler BEFORE the child can finish
   signal(SIGCHLD, cleanup); // or better - sigaction
   child = fork();
   if (child == -1) { exit(EXIT_FAILURE);}

   if (child == 0) { /* I am the child!*/
     // Do background stuff e.g. call exec   
   } else { /* I'm the parent! */
      sleep(4); // so we can see the cleanup
      puts("Parent is done");
   }
   return 0;
}

Я также узнал, что вы не можете многое сделать внутри обработчика сигнальной функции, кроме воздействия на переменную sig_atomic_t. Верно ли это и для ожидания дочернего процесса? Если да, то как лучше всего справиться с SIGCHLD?

...