Voici comment mon programme s'articule: il y a un parent qui fourche un enfant et cet enfant se forge un autre enfant. Il y a donc un parent, un enfant et un sous-enfant (c'est-à-dire que le parent de ce sous-enfant est l'enfant).Comment attendre un sous-enfant et un parent avant d'exécuter le processus?
L'enfant exécute une commande avec execlp(), disons date pour simplifier. Le sous-enfant fait la même chose.
Bien sûr, l'enfant forge le sous-enfant avant d'exécuter la commande.
Je cherche le sous-enfant pour exécuter la commande APRÈS que l'enfant ait exécuté sa propre commande. De plus, après que l'enfant et le sous-enfant aient exécuté leur commande, je voudrais que le parent continue son propre processus.
J'ai 2 problèmes:
- Je ne sais pas comment faire le parent d'attendre l'exécution de subchild
- Je ne peux pas faire la subchild attendre l'exécution de l'enfant (L'enfant perdre son pid lors de l'utilisation execlp)
Voici mon implémentation actuelle:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main (int argc, char **argv){
pid_t pid1, pid2;
pid1 = fork();
if (pid1 > 0)
{
int status;
// Wait child
printf("Parent waiting for child\n");
waitpid(pid1, &status, 0);
printf("Parent has waited child\n");
// Wait subchild
printf("Parent waiting for subchild\n");
// Wait sub-child here?
printf("Parent has waited subchild\n");
// End
printf("parent end\n");
}
else
{
pid2 = fork();
// Subchild
if (pid2 == 0) {
waitpid(getppid(), NULL, 0); // wait child? it doesn't work
execlp("/bin/date", "date", "+Subchild:\"%d-%m-%y\"", (char *) 0);
_exit(EXIT_FAILURE);
}
// Child
else {
execlp("/bin/date", "date", "+Child:\"%d-%m-%y\"", (char *) 0);
_exit(EXIT_FAILURE);
}
}
return 0;
}
Mes deux « problèmes » sont la ligne 21 et 33.
La sortie est la suivante:
Parent waiting for child
Subchild:"03-10-17"
Child:"03-10-17"
Parent has waited child
Parent waiting for subchild
Parent has waited subchild
parent end
Le subchild s'exécute aussi vite que possible ... Je résolus en utilisant cette variable partagée mais Je me sentais comme une solution de contournement et j'avais encore des problèmes avec le parent qui attendait le sous-enfant.
C'est un peu difficile de donner des conseils, malgré la clarté de votre question. Si vous voulez que les choses soient faites de manière séquentielle, forking sous-processus semble être la mauvaise voie à suivre. Pourquoi fourchette? Qu'est-ce que vous essayez de faire que vous voulez des processus séparés, mais une exécution séquentielle? Si vous n'étiez pas en train d'exécuter des programmes, vous pouviez utiliser des signaux pour faire la va-et-vient entre le parent et le groupe de processus, mais lorsque vous exécutez exec, vous perdez cette option. – Leonard
Une autre bonne lecture sur le sujet (avec l'exemple) est [** man 2 wait **] (https://linux.die.net/man/2/wait) –
Merci pour votre commentaire. Cela ressemble plus à un programme éducatif où la difficulté est cette architecture avec laquelle je dois trouver un moyen de créer une exécution séquentielle. J'ai essayé plusieurs solutions mais comme vous l'avez dit, exec() le rend assez difficile (variable partagée/sémaphore/...). – SugarMouse