Return value von fork()



  • Guten Morgen,
    ich bräuchte den ExitCode von dem Childprocess den ich mit fork() gestartet habe. Ich hoffe mal das meine Frage verständlich war :p

    Es wäre nett wenn mir einer hier weiter helfen könnte denn als ich meinen Ausbilder fragte meinte er "Nimm GetExitCodeProcess" und das ist bekannterweise die funktion die in der Winapi dafür zur verfügung steht... problem besteht nur leider daran das wir für Debian entwickeln und es mir rein garnichts nützt es unter windows geschafft zu haben 😃



  • man 2 wait



  • irgendwie werde ich daraus nicht schlau 😢



  • Und wie kann ich dir helfen? Wo ist das Problem? Mit "verstehe ich nicht" kann ich leider wenig anfangen. Was verstehst du nicht?



  • Also

    if (WIFEXITED(status)) {
                    printf("exited, status=%d\n", WEXITSTATUS(status));
    

    soll ja dann den Exitcode ausgeben oder?
    habe es von der seite hier: http://linux.die.net/man/2/wait



  • Synonym schrieb:

    Also

    if (WIFEXITED(status)) {
                    printf("exited, status=%d\n", WEXITSTATUS(status));
    

    soll ja dann den Exitcode ausgeben oder?
    habe es von der seite hier: http://linux.die.net/man/2/wait

    Ja. Tut es das nicht?



  • Man sollte ja eigentlich keine vollständigen Lösungen liefern, aber ich bin ja kein Pädagoge und daher weiß ich das ja nicht. Also hier ist ein Beispiel:

    #include <iostream>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <errno.h>
    #include <string.h>
    
    int main(int argc, char* argv[])
    {
      if (argc <= 1)
      {
        std::cerr << "usage: " << argv[0] << " process" << std::endl;
        return 1;
      }
    
      pid_t pid = fork();
      if (pid < 0)
      {
        std::cerr << "fork failed with errno " << errno << ": " << strerror(errno) << std::endl;
        return 1;
      }
    
      if (pid != 0)
      {
        // parent
        int status;
        wait(&status);
        std::cout << "return code: "<< WEXITSTATUS(status) << std::endl;
      }
      else
      {
        // child
        execvp(argv[1], argv+1);
        std::cerr << "exec failed with errno " << errno << ": " << strerror(errno) << std::endl;
      }
    }
    

    Abgespeichert als subproc.cpp und übersetzt mit "g++ -o subproc subproc.cpp" bekommst Du ein Binary mit dem Namen subproc. Das kannst Du dann beispielsweise so aufrufen:

    ./subproc ls foobar
    

    Der führt ls aus und gibt seinen return code aus.


Anmelden zum Antworten