Je programmant une coquille pour ma classe CS et une partie du projet consiste à exécuter un processus en arrière-plan si le caractère "&" est transmis par l'utilisateur. p>
Si un processus est exécuté au premier plan, j'ai simplement devrais-je appeler Execvp code> le processus et il reste en contrôle du terminal car il est au premier plan. Toutefois, s'il s'agit d'un processus d'arrière-plan, je dois retourner le contrôle à mon shell principal après avoir démarré l'exécution du processus. Je comprends que le système appelle
tcsetpgrp (pid_t) code> place le processus passé en tant qu'argument au premier plan, mais je ne comprends pas bien comment l'utiliser. p>
tcsepgrp code> après
Execvp code> s'il s'agit d'un processus d'arrière-plan? Si oui, puis-je obtenir le PID de ma coquille juste en appelant
getpid code>? P>
3 Réponses :
Vous devez regarder Fork pour créer le processus d'enfant. Ensuite, utilisez exécuté code> dans l'enfant pour exécuter la commande souhaitée. P>
Lorsque vous créez un nouveau pipeline, appelez Utilisez Lorsque la coque est en arrière-plan, il doit utiliser un bloquant Lorsque la coque est au premier plan, il devrait appeler tcsetpgrp () code> fonctionne sur groupes de processus em>, pas de processus individuels. Ce que vous voulez faire est celui-ci: p>
SETPGID () CODE> pour mettre tous les membres du pipeline dans un nouveau groupe de processus (avec le PID du premier processus dans le pipeline comme le Pgid). (Un pipeline est une séquence de processus lancés par votre shell lorsqu'il voit une demande comme
ls | grep foo | wc -l code> - le pipeline le plus simple n'a qu'un seul processus). Normalement, vous appelleriez
sepgid (0, 0) code> à partir du premier processus dans la pipeline, avant d'appeler
exécuté () code>. p> li>
tcsepgrp () code> pour gérer quel groupe de processus est au premier plan. Si vous déplacez un groupe de processus du premier plan en arrière-plan, vous définissez le groupe de processus de Shell en tant que groupe de processus de premier plan - vous pouvez l'obtenir avec
getppgid (0) code> dans la coque. P > li>
waiterpid () code> appeler pour attendre qu'un processus enfant quitte plutôt que de montrer une invite. Une fois que chaque processus dans le pipeline de premier plan est sorti, il devrait revenir à nouveau au premier plan (et montrer une invite). P> Li>
waiterpid () code> avec le
wnohang code> et
wuntracé code> wuntracé code> drapeaux pour vérifier Le statut de l'enfant traite juste avant de montrer l'invite - cela vous informera quand ils se sont arrêtés ou excités, et vous permettront d'informer l'utilisateur. P> li>
ol>
Si votre shell démarre un processus en utilisant & code> à l'arrière-plan IT, la variable
$! code> contiendra le PID du processus d'enfant. Vous pouvez ensuite envoyer des signaux à ce processus ou utiliser
wait $! Code> pour attendre qu'il soit terminé. P>
Laissez-nous essayer cela. Dans votre terminal préféré, lancez deux sessions. Dans la première exécution d'une commande, disons CAT B>, c'est-à-dire en FG. Passez à une autre session, trouvez le PID du chat en utilisant PS B>. Signal d'envoi SIGSTOP B> à celui-ci en utilisant Kill B>. Observez ce qui se passe et partagez vos conclusions.