Ожидание дочернего процесса

Это фрагмент моей программы, который работает, но исправляющая его машина пытается так:

strace ./watcher echo 2>&1 > /dev/null | grep wait | cut -c1-4

Ожидаемый результат:

wait

Но моя программа печатает случайное количество ожиданий (например):

wait
wait
wait
wait
wait
wait

Это код:

    // creates a child process
    pid_t process_id;
    int status;
    process_id = fork();
    switch(process_id)
    {
        case -1: // Error while making the forkFork failed
            fprintf(stderr, "Fork failed.\n");
            break;

        case 0: // Child process.
            execvp(command[0], command); // command here is char**

            // execvp only returns when error.
            Error(argv[0], 1); // Error just prints the error
            exit(1);
            break;

        default: // Parent process.
            while(!waitpid(process_id, &status, WNOHANG));
            finished(status); // It prints how the process has finished.
    }

Я думаю, что проблема в том, что пока внутри есть waitpid, это генерирует много ожиданий. Но если я удалю его и оставлю waitpid в покое, я получу такой вывод:

standard input: Input/output error

Есть ли способ сделать только один вызов ожидания без получения этой ошибки?


person XavierusWolf    schedule 24.05.2012    source источник


Ответы (1)


Вы можете попытаться не установить WNOHANG при вызове на waitpid().

Это сделает блок waitpid() до тех пор, пока дочерний процесс не завершится.

person alk    schedule 24.05.2012