7
votes

Après avoir suspendu le processus d'enfant avec SIGTSTP, Shell ne répond pas

Je codifie une coque de base en C, et je travaille à la suspension d'un processus enfant en ce moment.

Je pense que mon gestionnaire de signal est correct et que mon processus enfant est suspendu, mais après cela, le terminal devrait revenir au processus parent et cela ne se produit pas.

L'enfant est suspendu, mais mon shell n'inscrit plus d'entrée ni de sortie. tcsettpgrp () ne semble pas aider.

Voici mon gestionnaire de signal dans mon code shell pour SIGTSTP: xxx

peut-on me dire ce que je peux me dire ce que 'M Faire mal?

Suis je suspensez ma coquille avec l'enfant et dois-je retourner stdin et stdout à la coquille en quelque sorte? Comment ferais-je cela?

Merci!


0 commentaires

4 Réponses :


0
votes

tcsetpgrp est de spécifier quel est le travail de premier plan. Lorsque votre shell apparaît un travail au premier plan (sans & ), il devrait créer un nouveau groupe de processus et faire que le travail de premier plan (du terminal de contrôle, pas ce qui est sur STDIN). Ensuite, après avoir appuyé sur Ctrl-Z, ce travail recevra le TSTP. C'est le terminal qui suspend le travail, pas votre coquille. Votre shell ne devrait pas piéger TSTP ou envoyer TSTP à personne.

Il ne devrait que WAIT () Pour le travail, il a engendré et détecter quand il a été arrêté (et réclamer le groupe de premier plan et marquer le travail aussi suspendu en interne). Votre commande fg rendrait le groupe de processus de premier plan du travail à nouveau et envoyez un sigcont et attendez-le à nouveau, tandis que bg serait juste Envoyer le sigcont


3 commentaires

Merci pour la réponse. J'ai essayé de faire ce que tu dis, mais quand j'enlève mon gestionnaire de signal, le terminal suspend juste le parent et retourne à bash. J'ai besoin du parent pour continuer à courir.


C'est un problème clair et ne pas attraper SIGTSTP entraînerait certainement la suspension de sa coquille et laissera les enfants à traiter. Il a besoin de l'attraper pour que sa coquille ne suspendra pas. Je suis confronté au même problème maintenant qu'il a fait face plus tôt


@Adelqodmani, seul le groupe de processus de premier plan du terminal reçoit un SIGTSTP lorsque vous appuyez sur Ctrl-Z . La coquille qui n'attend que la résiliation du processus qu'il a commencé, est dans un groupe de processus qui n'est pas le groupe de processus de premier plan du terminal. Vous pouvez Ignorer SIGTSTP si vous le souhaitez, c'est probable ce que la plupart des coquillages font. Mon point était que vous devez jouer avec le groupe de processus de premier plan du terminal.



6
votes

C'est une vieille question mais je pense toujours que j'ai trouvé une réponse.
Vous n'avez pas écrit le code de votre parent, mais je suppose que cela ressemble à quelque chose comme:

void sigHandler(int signum){
     switch(signum){
        case SIGCHLD:
             // note that the last argument is important for the wait to work
             waitpid(-1, &status, WNOHANG);
             break;
     }
}


0 commentaires

0
votes

Je pourrais être en retard pour répondre à la question ici, mais c'est ce qui a fonctionné quand j'étais coincé avec le même problème. Selon les pages de l'homme pour Tcsettpgrp ()

La fonction TCsettpgrp () rend le groupe de processus avec ID de groupe de processus PRCRP Le groupe de processus de premier plan sur le terminal associé à FD, qui doit être le terminal de contrôle du processus d'appel, et toujours être associé à sa session. De plus, le PGRP doit être un (non vide) groupe de processus appartenant à la même session que l'appelant processus.

Si tcsetpgrp () est appelé par un membre d'un groupe de processus de fond dans sa session et le processus d'appel ne bloquent ni ignorent SIGTTOU, un signal SIGTTOU est envoyé à tous les membres de ce contexte groupe de processus.

Alors, ce qui a fonctionné pour moi ignorait le signal sigttou dans le programme Shell, avant de créer les processus qui viendraient au premier plan. Si je n'ignore pas ce signal, le noyau enverra ce signal à mon programme Shell et la suspendre.


0 commentaires

1
votes

J'ai utilisé des signaux avec des signaux pour effectuer le processus de pause et de reprendre avec Ctrl + C

vidéo lorsqu'il est en cours d'exécution: lien < / a>

code: xxx

J'espère que c'est utile.

S'il vous plaît commenter moi s'il y a des questions


0 commentaires