2009-04-17 18 views
1

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éé correctementenfant Engendré sort avec l'état = 127

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, cela exécute correctement et je reçois la message suivant:

Attendre: 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 terminé avec RC = 127

Après cela, je n'ai pas réussi à faire réapparaître l'enfant. J'ai inclus la section de code donnée ci-dessus dans une boucle for, mais elle ne se reproduirait pas correctement. Si je redémarre le processus parent, cela fonctionne pendant un certain temps mais le même problème revient après un certain temps.

Qu'est-ce que je fais mal ici?

Répondre

1

Vérifiez this link.

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és 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 de l'enfant pourrait sortir avec l'état de la sortie 127.

On dirait qu'il peut sortir avec 127 pour une foule de raisons.

+0

J'ai réécrit le code en utilisant fork et execvp pour obtenir une compréhension plus précise de l'erreur et il s'est avéré que l'info erreur réelle est: errno = 14 (mauvaise adresse) Certains creuser autour a révélé que c'était parce que je wasn Fin de ma liste d'arguments avec une dernière entrée de "NULL". argv = nouveau caractère [iSize + 1]; argv [iSize] = NULL; résolu le problème. – Gayan

0

Vérifiez le code retour de waitpid() pour être sûr qu'il n'y a pas de problème. La façon dont le code est lu suggère que vous générez seulement un processus fils à la fois (sinon il n'y aurait pas besoin d'appeler waitpid() dans la boucle). Cependant, dans ce cas, je ne m'attendrais pas à utiliser WNOHANG.

+0

L'appel waitpid renvoie une valeur> 0, ce qui signifie qu'il existe un enfant valide. – Gayan