Выход (1) не дает мне 1 в качестве значения выхода? - PullRequest
3 голосов
/ 08 марта 2020

Почему, когда я выполняю этот код внутри функции в c

int Pandoc(char *file)
{

    //printf("Pandoc is trying to convert the file...\n");

    // Forking
    pid_t pid;
    pid = fork();

    if (pid == -1)
    {
        perror("Fork Error");
    }
    // child process because return value zero
    else if (pid == 0)
    {

        //printf("Hello from Child!\n");
        // Pandoc will run here.

        //calling pandoc
        // argv array for: ls -l
        // Just like in main, the argv array must be NULL terminated.
        // try to run ./a.out -x -y, it will work
        char *output = replaceWord(file, ".md", ".html");
        //checking if the file exists

        char *ls_args[] = {"pandoc", file, "-o", output, NULL};
        //                    ^
        //  use the name ls
        //  rather than the
        //  path to /bin/ls

        // Little explaination
        // The primary difference between execv and execvp is that with execv you have to provide the full path to the binary file (i.e., the program).
        // With execvp, you do not need to specify the full path because execvp will search the local environment variable PATH for the executable.
        if(file_exist(output)){execvp(ls_args[0], ls_args);}
        else
        {
            //Error Handeler
            fprintf(stdout, "pandoc should failed with exit 42\n");
            exit(42);
            printf( "hello\n");
        }
    }
    return 0;
}

, я получаю 0 в качестве возвращаемого значения?

enter image description here

РЕДАКТИРОВАТЬ: enter image description here enter image description here

Редактировать: Итак, здесь я изменил возвращаемое значение основного на 5. Выходное значение для моего Функция выше до 42 (IDK, почему) Это дает мне 5 в качестве выхода .. понятия не имею, что происходит. Я должен был упомянуть, что я использую fork () в моем коде .. Может быть, причина. enter image description here

Я думаю, что мой выход отключил дочерний процесс, но основной процесс продолжился .., поэтому он возвращает мне возвращенное значение внутри моего основного, а не выходного.

1 Ответ

5 голосов
/ 08 марта 2020

Ваш дочерний процесс завершается со значением exoti c, но ваш основной процесс всегда завершается с 0, и именно это определяет $?.

Если вы хотите, чтобы $? было значением выхода дочерний процесс, вам потребуется wait() для него, получить код выхода дочернего процесса, а затем выйти из него с основным процессом.

...