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!
Brillant - merci beaucoup. – Patrick
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
Je vais utiliser un sleep dans la boucle donc ce n'est pas "trop" occupé – Patrick