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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top