Я узнал, что сигнал может появляться в любом месте при запуске своего кода. Например, этот код:
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
?