Question

J'utilise posix_spawnp pour exécuter différents processus et vérifier l'état (avec waitpid) pour vous assurer que l'enfant a été créé correctement

    int iRet = posix_spawnp(&iPID, zPath, NULL, NULL, argv, environ);       

    if (iRet != 0)
    {
        return false;
    }

    int iState;
    waitpid(static_cast<pid_t>(iPID), &iState, WNOHANG);
    cout << "Wait: PID " << iPID << " | State " << iState << endl;

    if (WIFEXITED(iState)) {
        printf("Child exited with RC=%d\n",WEXITSTATUS(iState));
    }
    else if (WIFSIGNALED(iState)) {
        printf("Child exited via signal %d\n",WTERMSIG(iState));
    }
    else
    {
        printf("Child is NORMAL");
    }

Au début, ce bien et j'exécute le message suivant:

  

Attendez: PID 15911 | État 0 enfant sorti   avec RC = 0

Après avoir exécuté le même processus plusieurs fois, le processus de l'enfant commence à sortir avec le statut 127.

  

Attendez: PID 15947 | État 32512 Enfant   sorti avec RC = 127

Après cela arrive, je ne pouvais pas amener l'enfant à se reproduire à nouveau. Je la section de enfermai le code ci-dessus dans une boucle, mais il ne serait pas correctement frayer. Si je redémarrer le processus parent, il travaille pendant un certain temps, mais le même problème affleure à nouveau après un certain temps.

Qu'est-ce que je fais mal ici?

Était-ce utile?

La solution

Vérifier ce lien .

Par exemple:

  

EINVAL La valeur spécifiée par file_actions ou attrp est invalide.

     

Les codes d'erreur pour les sous-routines posix_spawn et posix_spawnp sont affectées par les conditions suivantes:   Si cette erreur se produit après que le processus d'appel retourne avec succès à partir de la fonction posix_spawn ou posix_spawnp, le processus d'enfant pourrait sortir avec l'état de la sortie 127.

Il semble que cela pourrait sortir avec 127 pour une foule de raisons.

Autres conseils

Vérifiez le code de retour de waitpid() pour être sûr qu'il est de ne pas avoir des problèmes.

La façon dont le code lit suggère que vous fraye un seul processus enfant à un moment (sinon il n'y aurait pas besoin d'appeler waitpid() dans la boucle). Cependant, dans ce cas, je ne serais pas attendre à utiliser WNOHANG.

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