Vous voulez attraper le signal SIGCHLD, puis appeler une fonction. Vous voulez utiliser signal()
pour ce faire (man signal
). Dans l'exemple ci-dessous child_died()
est appelé après que le signal SIGCHLD soit intercepté (le processus enfant est mort à ce stade). S'il y a des informations dont vous avez besoin de passer de l'enfant au parent que child_died()
a besoin pour un conditionnel, vous devrez utiliser un tuyau (man pipe
). Voici un exemple de signal et conduite:
#include <signal.h>
#include <strings.h>
#include <stdio.h>
#define MAX_SIZE 256
void child_died(int);
int fd[2];
int main()
{
int pid;
extern int fd[];
char *str;
pipe(fd);
signal(SIGCHLD, child_died);
if ((pid = fork()) < 0) {
// error
printf("Error\n");
} else if (pid == 0) {
// child
printf("In child process\n");
close(fd[0]);
str = strdup("Message from child process.\n");
write(fd[1], str, strlen(str) + 1);
} else {
// parent
wait();
printf("Now in parent\n");
}
return 0;
}
void child_died(int s)
{
char *str;
close(fd[1]);
read(fd[0], str, MAX_SIZE);
printf("%s", str);
}
enregistrés en tant que sigchld.c et compilé avec: gcc -Wall sigchld.c -o sigchld
Si vous voulez passer un entier (comme le pid de l'enfant) ou un autre type de données de la le processus fils vers le processus parent, vous devrez soit le convertir en une chaîne et inversement, soit trouver un autre moyen de le faire.
Si vous voulez ignorer SIGCHLD alors dans mon exemple vous mettriez cette logique dans child_died()
. Utilisez simplement un simple if
. Je ne sais pas comment vous décidez quand ignorer le signal et quand imprimer ce que vous voulez, c'est pourquoi j'ai inclus les trucs de pipe dans mon code ci-dessus. Je pensais que vous utiliseriez des informations du processus fils et puisque child_died()
est appelée sur le processus parent, vous aurez besoin d'un moyen de transférer des données de l'enfant au processus parent.
J'espère que cela aide. Il peut y avoir des façons meilleures ou plus faciles d'accomplir cela que je ne connais pas. S'il y a alors s'il vous plaît commenter.
Dans certaines versions d'unix, ignorer SIGCHLD récupère automatiquement les processus enfants (apparemment). http://www.faqs.org/faqs/unix-faq/faq/part3/section-13.html –