2009-10-04 5 views
0

J'écris un shell. Il forge les processus d'arrière-plan et de premier plan. J'ai un problème avec le signal SIGTSTP. Donc, après avoir donné Ctrl^Z, SIGTSTP est généré car ce signal est transmis à mon shell et à ses processus enfants (tous les processus d'arrière-plan et de premier plan que mon shell a forkés). Mais comme dans un shell réel, SIGTSTP est livré uniquement aux processus de premier plan, pas aux processus d'arrière-plan. Donc comment contrôler ce comportement signifie empêcher le signal d'être envoyé aux processus d'arrière-plan de mon shell?Comment contrôler le signal SIGTSTP pour les processus enfants?

J'ai également essayé setpgid(), ce qui signifie que vous modifiez le pgid des processus d'arrière-plan. Mais une fois qu'un processus a fait exec, setpgid() renvoie une erreur.

Répondre

1

Si vous installez votre propre gestionnaire pour SIGTSTP, vous pouvez contrôler sa propagation à vos enfants (ou non). Puisque vous écrivez un shell, vous voulez probablement le faire avec quelques autres signaux (SIGINT au moins).

Impossible de setpgid après qu'un enfant a exec ed? Facile, appelez setpgid avant l'enfant exec s. Vous ne devriez pas avoir besoin de le changer par la suite – chaque travail doit avoir un pgid unique et vous devez continuer à définir le groupe de contrôle du terminal pour qu'il corresponde au pgid du travail actif.

+0

J'en ai besoin après exec aussi. Je peux apporter un processus d'arrière-plan pour foregorund à travers fg builtin. Je fais déjà dans le gestionnaire de signal – avd

+1

Vous le faites mal. Comme je le dis dans le dernier paragraphe, donnez à chaque travail un 'pgid' différent. Lorsque vous voulez mettre un travail au premier plan, utilisez 'tcsetpgrp' pour donner ce contrôle de groupe au terminal. Lorsque vous voulez mettre un travail en arrière-plan, utilisez 'tcsetpgrp' pour donner le contrôle du groupe de votre shell sur le terminal. – ephemient

Questions connexes