2017-10-03 17 views
0

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.

+0

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

+0

Une autre bonne lecture sur le sujet (avec l'exemple) est [** man 2 wait **] (https://linux.die.net/man/2/wait) –

+0

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

Répondre

0

Grâce à @JonathanLeffler, j'ai pu résoudre le problème en créant des tuyaux. Il a fallu du temps car je ne savais pas comment fonctionnent les pipes mais au final c'était beaucoup plus facile que je ne le pensais.

@ DavidC.Rankin J'ai lu la documentation sur la fonction wait mais cela ne semble pas être utile dans cette situation.

Merci.