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?
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