Comment puis-je obtenir tcsetpgrp() pour travailler en C?
Je suis en train de donner à un enfant (au moyen d' fork()
) de premier plan de l'accès au terminal.
Après je fork()
, je exécutez le code suivant dans le processus de l'enfant:
setpgid(0, 0);
Et:
setpgid(child, child);
Dans le processus parent.
Cela donne à l'enfant son propre groupe de processus. L'appel à setpgid()
fonctionne correctement.
Maintenant, je veux donner à l'enfant l'accès au terminal.
J'ai ajouté ce qui suit à l'enfant après la setpgid()
appel:
if (!tcsetpgrp(STDIN_FILENO, getpid())) {
perror("tcsetpgrp failed");
}
Après cela, il y a un execv()
commande à lancer /usr/bin/nano
.
Cependant, au lieu d'avoir nano
venir, rien ne se passe, et le terminal semble comme si elle attendait la saisie de l'utilisateur.
De plus, le code ne semble s'exécuter après la tcsetpgrp()
appel.
J'ai lu quelque part que j'ai besoin d'envoyer un SIGCONT
signal pour le processus de l'enfant pour le faire fonctionner. Si le processus est arrêté, comment puis-je le faire? Le parent d'envoyer le signal?
Comment puis-je faire au sujet de l'envoi de la SIGCONT
signal si c'est la solution?
raise(SIGCONT);
Aussi, je ne suis pas sûr si cela aide, mais le code fonctionne et génère nano
si je lance mon programme avec:
exec ./program
Au lieu de:
./program
Des idées? Merci beaucoup!
- Animateur de la séance (lire: shell) doit appeler tcsetpgrp()
Vous devez vous connecter pour publier un commentaire.
man 3 tcsetpgrp états:
Vous devez appeler tcsetpgrp() dans votre processus parent pas dans l'enfant. Toutefois, si votre parent processus a commencé et s'est déplacée en arrière-plan, il recevra SIGTTOU et va être arrêté.
Pensé à elle. J'ai de l'ignorer tout SIGTTOU signaux.
Je l'ai fait en ajoutant:
Avant la
tcsetpgrp()
appel.Parent, plutôt que de l'enfant qui doit invoquer tcsetpgrp(). Après setpgid() l'appel, l'enfant devient un processus d'arrière-plan. Un cas valide est au premier plan du groupe donne son autorisation, laisse un arrière-plan un groupe de premier plan et d'arrière-plan. Un processus en arrière-plan le groupe ne pouvez pas prendre le contrôle du terminal. Exemple de code peut-être ressembler à:
execlp()
ne reviendra jamais. Alors où dois-je appelertcsetpgrp()
pour ajouter un parent dans le processus de premier plan à nouveau le groupe?tcsetpgrp()
pour ajouter du processus parent au premier plan du processus de groupe. C'est déjà répondu dans @John Kurlak solution.