почему wait() возвращает -1 в версии xcode 7.2.1 (7C1002)

ребята, у меня есть следующий код c:

#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <errno.h>


int main (int argc, char *argv[])
{
    int exit;
    pid_t tc_pid, ret_pid;
    tc_pid = fork();
    if(tc_pid != 0){
        ret_pid = wait(&exit);
        printf("parent process done, tc_pid = %d, ret_pid = %d, errno = %d\n", tc_pid, ret_pid, errno);
        fflush(stdout);
    }
    printf("parent process done, tcpid = %d, my_pid = %d\n", tc_pid, getpid());
    fflush(stdout);

    return 0;
}

вывод на xcode:

parent process done, tcpid = 0, my_pid = 74377
parent process done, tc_pid = 74377, ret_pid = -1, errno = 4
parent process done, tcpid = 74377, my_pid = 74374

где здесь возвращаемое значение wait() равно -1 (должно быть 74377, если правильно), а errno равно -4

Однако, когда я использую тот же код, запущенный в терминале (я использую zsh), вывод:

parent process done, tcpid = 0, my_pid = 74419
parent process done, tc_pid = 74419, ret_pid = 74419, errno = 0
parent process done, tcpid = 74419, my_pid = 74418

чего я и хочу. Кто-нибудь знает, почему это произошло? Спасибо, парни.

моя OSX — 10.11.3, а моя машина — MBPR начала 2015 года, xcode 7.2.1, gcc 4.2.1, Apple LLVM версии 7.0.2 (clang-700.1.81), цель: x86_64-apple-darwin15.3.0, модель потока : позикс


person Nimal    schedule 10.03.2016    source источник


Ответы (1)


Согласно errno.h, номер ошибки 4 равен EINTR, что соответствует справочная страница для wait гласит:

The call is interrupted by a caught signal or the signal does not have the SA_RESTART flag set.

Очевидно, вы используете сигнал, чтобы заставить wait выйти. Возможно, вам нужно переосмыслить, что вы в конечном итоге пытаетесь здесь сделать, и есть ли способ сделать это без использования wait?

person Michael Dautermann    schedule 10.03.2016
comment
Привет, Майкл, спасибо за ответ, я просто хочу посмотреть, как работает fork() и как работает wait(). Вопрос в том, что в gcc вывод правильный, а в xcode нет, почему это происходит, xcode отправляет сигнал прерывания для обработки? - person Nimal; 11.03.2016