Tuer l’arborescence de processus sans imprimer ‘Killed’ dans C

J’essaie de tuer une arborescence de processus entière en C. Je suis capable de le faire, mais quand je lance le code, il affiche “Killed”. Je ne veux pas ça. Est-il possible d’obtenir le même résultat sans imprimer “Killed”?

C’est le code que j’utilise:

#define _POSIX_SOURCE #include  #include  #include  #include  #include  int main() { int pid = fork(); if (pid == 0) { sleep(2); printf("child printf\n"); } else { sleep(1); kill(-getpid(), SIGKILL); } return EXIT_SUCCESS; } 

Je comstack ceci avec gcc -std=c99 -Wall test.c Quand je lance ./a.out , c’est la sortie:

 Killed 

Si je change le sleep(1) en sleep(3) , c’est la sortie:

 child printf Killed 

Dans les deux cas, je veux que la ligne Killed supprimée.

Note: Dans le code réel, le processus fils sera execve avec un autre. Il y aura plusieurs procés enfants. Parce qu’ils peuvent eux-mêmes avoir des enfants, kill(pid, SIGKILL) ne fonctionnera pas.

Selon la page du manuel de mise à kill , une valeur de pid inférieure à -1 (que vous passerez) signifie

Si pid est inférieur à -1 , alors sig est envoyé à chaque processus du groupe de processus dont l’ID est -pid .

C’est-à-dire que vous allez tuer le processus parent (et qui produira le message) puisque vous passez -getpid() , mais vous ne tuerez aucun autre processus enfant.

Si vous voulez tuer un processus spécifique, transmettez son identifiant de processus exact (dans votre cas pid ) à l’appel de mise à kill .

Si vous voulez tuer tous les processus enfants, vous devez créer un groupe de processus, de sorte que tous les enfants en deviennent membres et supprimer tous les processus du groupe de processus (en passant le pid 0 ). Notez que cela appellera également le processus parent.

Si vous voulez tuer les processus enfants, mais pas le processus parent, créez un processus proxy qui crée un nouveau groupe de processus et faites en sorte que ce processus proxy crée les processus enfants. Puis tuez le groupe de processus du processus proxy.

Quoi qu’il en soit, la solution à votre problème est de ne pas tuer le processus parent, mais de le laisser sortir normalement.

Je pense que c’est le shell ( bash ou sh ) qui imprime cela, selon les circonstances, le processus au premier plan s’est terminé, vous permettant de savoir ce qui est arrivé au processus avec lequel vous étiez en train d’interagir.

Une façon de le supprimer est simplement de faire la command | cat command | cat

Mieux vaut utiliser execl("yourcommandhere"); avec > /dev/null 2>&1