C Двусторонняя труба не работает - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь установить двусторонний канал между родительским и дочерним процессами в C, но мой код (как показано ниже) не работает:

int main() {
    int fd1[2], fd2[2];
    char c;
    fprintf(stderr, "Pipe 1 return: %i\n", pipe(fd1));
    fprintf(stderr, "Pipe 2 return: %i\n", pipe(fd2));
    pid_t pid = fork();
    if (pid == -1) {
        fprintf(stderr, "Error forking");
        return -1;
    }
    if (!pid) {
        dup2(fd1[1], 1);
        dup2(fd2[0], 0);
        close(fd1[0]);
        close(fd2[1]);
        //fprintf(stderr, "setvbuffer output: %i\n", setvbuf(stdin, NULL, _IONBF, 0));
        fprintf(stderr, "Parent runing. Receiving\n");
        c = getchar();
        fprintf(stderr, "Parent received char. Modifying\n");
        putchar(c + 2);
        fprintf(stderr, "Parent sent char\n");
    } else {
        dup2(fd1[0], 0);
        dup2(fd2[1], 1);
        close(fd1[1]);
        close(fd2[0]);
        //fprintf(stderr, "setvbuffer output: %i\n", setvbuf(stdin, NULL, _IONBF, 0));
        fprintf(stderr, "Child running. Printing\n");
        putchar('c');
        c = getchar();
        fprintf(stderr, "Child received returned char: %c\n", c);
    }

}

Когда я запускаю эту программу, программа сразу же остается в ожидании первого getchar (). Я также пытался отправлять / получать строки текста, используя закомментированные строки setvbuf (), использовать sleep () перед чтением из stdin и т. Д.

Это упрощенная версия моего реального кода, который обменивается данными между двумя разными программами, и там я, кажется, могу успешно общаться в одном направлении.

1 Ответ

0 голосов
/ 04 мая 2018

Как предложил Джон в комментариях, вызов fflush (stdout) после каждого оператора печати устраняет проблему.

...