2017-03-19 2 views
0

Je suis en train de jouer avec du code c, essayant d'avoir une série de processus enfants effectuant un travail asynchrone, suivi d'un travail synchrone.Synchronisation de l'enfant parent avec les signaux et la pause

Le parent est responsable de l'organisation de la nature synchrone des enfants.

Voici l'idée générale dans le code:

#define CHILDREN 5 

void myHandle(int d) {} 

int main() { 
    int i; 
    int pid[CHILDREN]; 
    signal(SIGUSR1, myHandle); 
    for(i = 0 ; i < CHILDREN ; i++){ 
     pid[i] = fork(); 
     if (pid[i] == 0){ 

      // DO SOME ASYNCHRONOUS WORK 

      // tell my parent I am done: 
      kill(getppid(), SIGUSR1); 

      // wait for parent to wake me up. 
      pause(); 

      // DO SOME SYNCHRONOUS WORK 

      //wake parent back up. 
      kill(getppid() , SIGUSR1); 

      exit(1); 
     } 
    } 

    // Wait for all children to finish async work: 
    for (i = 0 ; i < CHILDREN ; i++) { 
     pause(); // ISSUE IS HERE 
    } 

    // wake children back up in order: 
    for (i = 0 ; i < CHILDREN ; i++) { 
     kill(pid[i], SIGUSR1); 
     // wait for child to finish work. 
     pause(); 
    } 

    return 0; 
} 

Ce code fonctionne réellement (la plupart du temps). Le problème est que le parent s'arrête dans une boucle for. Dans certains cas, les enfants multiples finissent leur travail asynchrone en même temps, ce qui entraîne de nombreux appels de tuer vers le parent. La boucle ne peut pas itérer assez rapidement pour que le parent soit en état de pause pour tous les appels kill, ce qui provoque le blocage du programme sur une pause qui n'a pas reçu de signal.

Toute aide ou recommandation serait formidable - merci à tous!

Répondre

1

Une solution possible serait d'avoir un tableau de taille CHILDREN dans votre fonction principale. Et quand un enfant a fini, mettez une valeur dans son élément du tableau. Ensuite, le père doit juste vérifier si tous les drapeaux du tableau sont levés.

De cette façon, il n'y aura pas d'écrire des conflits entre les enfants, parce qu'ils ont chacun leur propre zone

+0

Brillant - merci beaucoup. – Patrick

+0

Le seul problème avec ceci est que le père devra être dans une attente active, en vérifiant constamment si les drapeaux sont levés. Alors que dans votre solution, le pause() en fait une attente passive – Pantoofle

+0

Je vais utiliser un sleep dans la boucle donc ce n'est pas "trop" occupé – Patrick