Nie jestem w stanie zrozumieć danych wyjściowych dla następującego programu. Zauważyłem, że po powrocie procesu potomnego proces rodzica nie śpi przez 3 sekundy przed oczekiwaniem(). Jeśli SIGCHLD jest ustawione na domyślną procedurę obsługi, to śpi przez 3 sekundy, wywołując oczekiwanie i powracając zgodnie z oczekiwaniami. Co się dokładnie tutaj dzieje?Opis SIGCHLD, gdy proces potomny kończy się
# include <unistd.h>
# include <sys/types.h>
# include <stdio.h>
# include <sys/wait.h>
# include <signal.h>
void handler(int sig) {
printf("Iam in handler ...\n");
}
main() {
int status;
pid_t pid;
struct sigaction act;
//act.sa_flags=SA_NOCLDSTOP;
act.sa_handler=handler;
sigaction(SIGCHLD,&act,NULL);
if(!fork()) {
printf("child process id is %d\n",getpid());
return 1;
}
printf("xxx ...\n");
sleep(3);
pid = wait(&status);
printf("process terminated is %d\n",pid);
}
output::
xxx ...
child process id is 2445
Iam in handler ...
process terminated is 2445
dzięki za odpowiedź ur. Jeszcze jedna wątpliwość - czytałem z postów, że restartowanie wywołań systemowych jest uzależnione od jego implementacji, a niektóre wywołania systemowe w ogóle się nie uruchamiają. Czy to prawda? Czy ponowne uruchamianie wywołań systemowych jest takie samo, jak dwukrotne wywołanie tego samego połączenia? – Goutham
@ Goutham to nie to samo. Pomyśl o tym jako o "sygnale, który stara się nie zwracać" EINTR "i tak, restartowanie sygnału jest w większości zależne od implementacji. – cnicutar