Неопределенная ошибка при использовании dup2 для перенаправления стандартного ввода и вывода. - PullRequest
0 голосов
/ 19 марта 2012

Я хотел бы использовать каналы для перенаправления стандартного ввода и вывода дочернего процесса.

В настоящий момент у меня есть следующий код:

void child(int pipeIn[], int pipeOut[]) {

    char buff[20];
    const char msg[]="Child Message\n";
    close(pipeIn[1]);
    close(pipeOut[0]);

    if (dup2(pipeIn[0], 0))
        perror("dup2 pipeIn");

    if (dup2(pipeOut[1], 1))
        perror("dup2 pipeOut");

    close(pipeIn[0]);
    close(pipeOut[1]);

    for (int i = 0; i < 10; ++i) {
        read(0, buff, 20);
        fprintf(stderr, "Child: %s\n",buff);
        printf("%s",msg);
    }
}

void parent(int pipeIn[], int pipeOut[]) {

    char buff[20];

    const char msg[]="Parent Message\n";
    close(pipeIn[0]);
    close(pipeOut[1]);

    for (int i = 0; i < 10; ++i) {
        write(pipeIn[1], msg, 16);
        read(pipeOut[0], buff, 50);
        printf("Parent: %s", buff);

    }

}

void test() {

    int pipeOut[2],pipeIn[2];

    if(pipe(pipeOut)) {
        perror("pipeOut");
        exit(1);
    }

    if(pipe(pipeIn)) {
        perror("pipeIn");
        exit(1);
    }

    int pid = fork();

    if (pid == -1) {
        perror("fork()");
        exit(1);
    } 
    else if (pid == 0) 
        child(pipeIn, pipeOut);
    else 
        parent(pipeIn,pipeOut);

}

Однако этот код не являетсяработает, потому что я продолжаю получать

dup2 pipeOut: неопределенная ошибка: 0

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

То, что я не понимаю, почему я продолжаю получать эту ошибку.Я делаю что-то неправильно?

Я работаю над MacOS Lion 10.7.2 и Xcode 4.2.1.


ОБНОВЛЕНИЕ: после ответа Адама Розенфилда я исправил свое утверждение if.Однако код все еще останавливается, как я уже сказал (я могу прочитать только первое, что печатает ребенок Child: Parent Message и ничего больше).

Есть идеи, почему это происходит?

1 Ответ

2 голосов
/ 19 марта 2012

dup2(2) возвращает неотрицательное целое число в случае успеха, а именно новый дескриптор файла. Возвращает -1 при ошибке. В вашем случае он возвращает 0 при первом вызове, потому что вы дублируете канал на дескриптор файла 0.

Чтобы исправить это, измените ваши чеки с if(dup2(...)) на if(dup2(...) == -1).

...