Question

i ont un code comme celui-ci ...

c = fork();
if(c==0) {
    close(fd[READ]);

    if (dup2(fd[WRITE],STDOUT_FILENO) != -1) 
        execlp("ssh", "ssh", host, "ls" , NULL);
    _exit(1);

}   
close(fd[WRITE]);

fd [READ] et Fd [WRITE] sont des descripteurs de fichiers de tuyau.

quand je le lance en permanence, il y a beaucoup de processus zombie quand je l'utilise ps ax. Comment remédier à cette situation? Est-ce parce que je ne suis pas en utilisant le parent d'attendre l'état de sortie du processus enfant ...

Était-ce utile?

La solution

Si vous avez pas l'intention de wait pour vos processus enfants, définissez le gestionnaire de SIGCHLD à SIG_IGN d'avoir le noyau automatiquement moissonnent vos enfants, par exemple.

signal(SIGCHLD, SIG_IGN);

Autres conseils

Oui, le parent doit attendre l'état de retour de l'enfant. Vous pouvez le faire de manière asynchrone en attrapant SIGCHILD dans le processus parent puis appelez waitpid dans la méthode de capture.

Oui, waitpid () doit être appelée de parent. waitpid () permet de nettoyer en place un processus enfant du processus parent, qui est actuellement à l'état terminé.

Vous pouvez ajouter ci-dessous le code à votre programme:

if(c>0)
{
while(1){ 
ret = waitpid(-1,&status,0);

if(ret>0){
if(WIFEXITED(status)){
   if(WEXITSTATUS(status) == 0){ 
       printf("child process terminated normally and successfully\n");
   }
   else{

       printf("child process terminated normally and unsuccessfully\n");
   }
 }
else{ 

       printf("child process terminated abnormally and unsuccessfully\n");
    }
}
if(ret<0) { 
     break; 
    }
  }
}

Pour votre information:. Plus sur le sujet waitpid

Le premier paramètre est fixé à -1 de telle sorte que waitpid () permet de nettoyer en place un processus enfant de ce processus parent, qui est actuellement en premier paramètre state.The terminaison peut aussi être + ve - dans ce cas, waitpid () volonté nettoyage que l'enfant spécifique process.Most usage commun est de mettre en premier paramètre à -1 se référer également à la page de manuel waitpid (). Le second paramètre est utilisé pour extraire le code d'état terminaison / sortie du processus enfant - API d'appel système waitpid () remplit le champ d'état lorsque l'API d'appel système est invoqué. le dernier champ est le champ des drapeaux - actuellement utilisé - dans la plupart des cas, le champ des drapeaux sera réglé sur 0 - ce qui signifie, le comportement par défaut de l'API d'appel système !!! si vous avez vraiment besoin de drapeaux d'utilisation, reportez-vous à la page de manuel waitpid ().

Note: Dans le code que vous avez soumis, _exit (1) sera appelé IFF execlp () échoue. de sorte que vous pouvez mettre une condition pour execlp () échouent et que _exit condition () peut être appelé. La raison en est, les fonctions de execlp () renvoient uniquement si une erreur est survenue.

Code modifié peut être comme ci-dessous:

c = fork();
if(c==0) {
close(fd[READ]);

if (dup2(fd[WRITE],STDOUT_FILENO) != -1) 
    ret_execlp = execlp("ssh", "ssh", host, "ls" , NULL);
if(ret_execlp == -1 ) {
      printf("execlp is failed");
      _exit(1);
   }
}
close(fd[WRITE]);

J'apprécie les réponses ci-dessus 2. Souhaite que cette réponse peut donner plus de clarté. Merci.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top