7
votes

Envoi d'un processus à l'arrière-plan et à renvoyer le contrôle à ma coquille

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.

Si un processus est exécuté au premier plan, j'ai simplement Execvp 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) place le processus passé en tant qu'argument au premier plan, mais je ne comprends pas bien comment l'utiliser.

devrais-je appeler tcsepgrp après Execvp 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 ?


1 commentaires

Laissez-nous essayer cela. Dans votre terminal préféré, lancez deux sessions. Dans la première exécution d'une commande, disons CAT , c'est-à-dire en FG. Passez à une autre session, trouvez le PID du chat en utilisant PS . Signal d'envoi SIGSTOP à celui-ci en utilisant Kill . Observez ce qui se passe et partagez vos conclusions.


3 Réponses :


-2
votes

Vous devez regarder Fork pour créer le processus d'enfant. Ensuite, utilisez exécuté dans l'enfant pour exécuter la commande souhaitée.


0 commentaires

10
votes

tcsetpgrp () fonctionne sur groupes de processus , pas de processus individuels. Ce que vous voulez faire est celui-ci:

  1. Lorsque vous créez un nouveau pipeline, appelez SETPGID () 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 - le pipeline le plus simple n'a qu'un seul processus). Normalement, vous appelleriez sepgid (0, 0) à partir du premier processus dans la pipeline, avant d'appeler exécuté () .

  2. Utilisez tcsepgrp () 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) dans la coque.

  3. Lorsque la coque est en arrière-plan, il doit utiliser un bloquant waiterpid () 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).

  4. Lorsque la coque est au premier plan, il devrait appeler waiterpid () avec le wnohang et wuntracé wuntracé 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.


0 commentaires

-1
votes

Si votre shell démarre un processus en utilisant & à l'arrière-plan IT, la variable $! contiendra le PID du processus d'enfant. Vous pouvez ensuite envoyer des signaux à ce processus ou utiliser wait $! pour attendre qu'il soit terminé.


0 commentaires