2012-01-13 3 views
2

J'écris un programme C dans lequel le parent forge n les processus enfants. Un processus enfant une fois créé appelle un SIGSTOP pour permettre la création d'autres processus enfants. Le parent après avoir créé tous les processus enfant n envoie un signal SIGCONT à tous les enfants.Terminer parent et le processus enfant sur Ctrl-C

Tous les processus enfants exécutent une boucle infinie et partagent une ressource commune à l'aide de sémaphores. Maintenant, je veux que chaque fois que l'utilisateur appuie sur ctrl-c, le parent et tous les processus enfants se terminent ensemble. Cependant, avant de terminer le processus fils, il faut mettre à jour dans un fichier combien de fois chacun a utilisé la ressource.

par exemple:

Process 1 - 5 times 
Process 2 - 3 times 

et ainsi de suite.

Besoin d'aide dans cette mise en œuvre ... s'il vous plaît

+3

Qu'avez-vous? Avec quelles parties avez-vous besoin d'aide? Vous aurez besoin d'un gestionnaire de signal pour SIGINT (mais probablement pas pour SIGCONT).Vous devriez donc regarder 'sigaction()'. Je suppose que vous avez déjà le code du sémaphore? –

+0

Dupliquer? http://stackoverflow.com/questions/284325/how-to-make-child-process-die-after-parent-exits contient une bonne réponse. – ugoren

+1

@JonathanLeffler La partie sémaphore fonctionne très bien pour moi. Ce que je suis coincé est dans la partie où, en appuyant sur ctrl-c pour quitter les processus fils devraient d'abord mettre à jour dans un fichier combien de fois chacun a utilisé la ressource. par la suite, l'enfant et le parent se terminent l'un après l'autre. – ritz

Répondre

2

La fonction de gestionnaire de signal formel devrait faire aussi peu que possible. La norme C indique qu'elle peut écrire dans une variable volatile sig_atomic_t ou appeler le abort() ou le _Exit() (ou, avec restrictions, signal()). POSIX permet plus de choses, et vous travaillez probablement sur Linux (bien que vous ne l'ayez pas dit). Ainsi, votre gestionnaire de signal va changer la valeur d'une variable sig_atomic_t de 0 à 1 pour indiquer que le signal s'est produit. Ainsi, vos processus fils seront bouclés. Dans le cadre de la condition de boucle, vous devez vérifier une variable sig_atomic_t pour voir si l'enfant doit se terminer. Lorsqu'il détecte qu'un signal s'est produit, il arrête de boucler, ouvre le fichier journal pour ajouter, écrit ses informations dans ce fichier et quitte. Vous pouvez vérifier la variable sig_atomic_t à d'autres points du traitement que la seule condition de boucle principale; c'est ta décision.

Notez que vous devez utiliser sigaction() plutôt que signal() pour contrôler la gestion du signal et bloquer les interruptions pendant le traitement d'un signal.

Donc, pour résumer:

  • Votre gestionnaire de signal ne aussi peu que possible.
  • Votre code détecte dans la boucle principale lorsque le gestionnaire de signal a été appelé et s'arrange pour quitter.
  • Votre code peut également détecter quand le gestionnaire de signal a été appelé à d'autres points pratiques.
  • Vous pouvez appeler une fonction pour effectuer la consignation et quitter.
0

Pour écrire le fichier, vous devez ajouter le code à écrire audit fichier dans votre gestionnaire de signal pour SIGINT. Si vous voulez que chaque processus écrit dans ce fichier, vous devez vous assurer que le SIGINT est envoyé à l'ensemble du groupe de processus.

Vous pouvez probablement vous débrouiller sans envoyer le SIGQUIT à chacun d'entre eux, car chaque processus peut simplement quitter lui-même après avoir traité SIGINT. Si vous souhaitez optimiser un peu, vous pouvez conserver une structure de données partagées dont les processus ont déjà reçu le SIGINT afin de ne pas envoyer à chaque processus plusieurs SIGINT.

Questions connexes