SIGSTOP ne fonctionne pas dans le programme c

J’essaie d’écrire un programme C dans lequel le processus parent suspend le processus enfant et, après quelques secondes, continue de l’exécuter.

#include  #include  #include  #include  void sigstop(); void sigcont(); void sigquit(); int main() { int pid; if ((pid = fork()) < 0) { perror("fork"); exit(1); } if (pid == 0) { /* child */ signal(SIGSTOP,sigstop); signal(SIGCONT,sigcont); signal(SIGQUIT, sigquit); for(;;); /* loop for ever */ } else { printf("\nPARENT: sending SIGSTOP to suspend the process\n\n"); kill(pid, SIGSTOP); sleep(5); printf("\nPARENT: sending SIGCONT to continue the suspended process\n\n"); kill(pid, SIGCONT); sleep(5); printf("killing child"); kill(pid,SIGQUIT); sleep(5); } } void sigstop() { printf("CHILD: I've been suspended\n"); } void sigcont() { printf("CHILD: I'm back\n"); } void sigquit() { printf("My DADDY has Killed me!!!\n"); exit(0); } 

printf dans sigstop() n’est jamais exécuté et sigquit() est appelé avant printf("killing child"); . Comment cela se produit-il et comment puis-je obtenir la sortie dans le bon ordre?

Si vous lisez la page de manuel signal(7) vous verrez que

Les signaux SIGKILL et SIGSTOP ne peuvent pas être interceptés, bloqués ou ignorés.

Vous ne pouvez tout simplement pas attraper ce signal.


Le dernier bit, à propos de "Killing child" est très facile à corriger: il ajoute une nouvelle ligne à la chaîne que vous imprimez.

Ceci est dû au fait que la sortie sur stdout (qui correspond à ce que printf écrit) est par défaut tamponnée en ligne . Cela signifie que le tampon interne de stdout est vidé (c’est-à-dire réellement écrit sur le terminal) sur une nouvelle ligne. Si vous n’avez pas la nouvelle ligne, le tampon sera vidé lorsque le processus se terminera, c’est-à-dire après que vous ayez quitté le processus enfant.