Spawned Kind verlässt mit state = 127
Frage
Ich verwende posix_spawnp verschiedene Prozesse auszuführen und ich den Status (mit waitpid) das Kind, um sicherzustellen, ordnungsgemäß erstellt
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");
}
Zuerst diese korrekt ausgeführt und ich erhalte die folgende Meldung an:
Wait: PID 15911 | Zustand 0 Kind verlassen mit RC = 0
dem gleichen Prozess mehrmals Nach Ausführung der Kind-Prozess beginnt Ausgang mit dem Status 127.
Wait: PID 15947 | Zustand 32512 Kind verlassen mit RC = 127
Nach dem dies geschieht, konnte ich nicht das Kind wieder zum Laichen bekommen. Ich eingeschlossen, um den Code-Abschnitt oben in einem for-Schleife gegeben, aber es wäre nicht richtig laichen. Wenn ich den übergeordneten Prozess neu starten, funktioniert es für eine Weile, aber das gleiche Problem taucht nach einer Weile wieder.
Was bin ich falsch hier?
Lösung
Überprüfen Sie Link .
Zum Beispiel:
EINVAL Der angegebene Wert von file_actions oder attrp ist ungültig.
Die Fehlercodes für die posix_spawn und posix_spawnp Subroutinen werden durch die folgenden Bedingungen beeinflusst: Wenn dieser Fehler auftritt, nachdem der Anrufprozess von der posix_spawn oder posix_spawnp Funktion erfolgreich zurückgegeben wird, kann das Kind Prozess mit Exit-Status verlassen 127.
Es sieht aus, als ob es mit 127 für eine ganze Reihe von Gründen verlassen könnte.
Andere Tipps
Überprüfen Sie den Rückgabecode von waitpid()
um sicher zu sein, dass es keine Probleme mit.
Die Art und Weise liest der Code läßt vermuten, dass Sie zu einem Zeitpunkt nur ein Kind Prozess laichen (sonst würde es keine Notwendigkeit, waitpid()
innerhalb der Schleife zu nennen). Aber in diesem Fall würde ich nicht erwarten, dass WNOHANG
verwenden.