Создайте двустороннюю связь между родителем и потомком, используя каналы в C - PullRequest
0 голосов
/ 23 сентября 2018

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

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {
    int firstPipe[2];
    int secondPipe[2];
    if (pipe(firstPipe) < 0) {
        perror("pipe");
        exit(1);
    }
    if (pipe(secondPipe) < 0) {
        perror("pipe");
        exit(1);
    }
    if (fork() != 0) { // child
        dup2(firstPipe[0], 0);
        dup2(secondPipe[1], 1);
        char input[70];
        printf("Mr. Stark...");
        fgets(input, 70, stdin);
        fprintf(stderr, "%s I don't wanna go...\n", input);
    } else { // parent
        dup2(secondPipe[0], 0);
        dup2(firstPipe[1], 1);
        char message[70];
        fgets(message, 70, stdin);
        printf("%s I don't feel so good...", message);
    }
    return 0;
}

Предполагается, что эта программа отправит сообщение от дочернего к родительскому, а затем к родительскому.отправляет ответ ребенку, а затем ребенок печатает окончательный результат (мистер Старк ... Я не очень хорошо себя чувствую ... я не хочу идти ...) в stderr, но он не работает:(Когда я пытаюсь его запустить, он зависает, как будто один из процессов (или оба) ожидает ввода. Что-то не так с моим кодом? Я открыт для предложений других подходов, есликак конечный результат работает. Спасибо за помощь.

1 Ответ

0 голосов
/ 23 сентября 2018

fgets читает до тех пор, пока не увидит новую строку (или буфер не заполнится).

Родитель начинает с

fgets(message, 70, stdin);

, ожидая строку.

Дочерний вывод

printf("Mr. Stark...");

затем также ждет:

fgets(input, 70, stdin);

"Mr. Stark..." не содержит символа новой строки.На самом деле, он, вероятно, вообще не отправляется, а вместо этого помещается в буфер внутри stdout, но это можно исправить с помощью fflush(stdout) после printf.

Но даже тогда fgets все еще будет ждатьдля новой строки, которая никогда не приходит.

Исправлено:

printf("Mr. Stark...\n");
fflush(stdout);
...