Как вывести символ через канал?

Добрый день!

Есть задача:
Для установления двусторонней связи между процессами можно создать два канала,
работающих в разных направлениях.
Придумайте возможный диалог между двумя процессами и реализуйте его при
помощи двух каналов.


Нашёл в интернете пример двусторонней связи через двусторонний канал.

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

int main(int argc, char **argv) {

int fd[2], n;
char c;
pipe(fd); 

if (!fork()) {

    write(fd[0], "c", 1);

    sleep(1);

    if ((n = read(fd[0], &c, 1)) != 1) {
        printf("Дочерний процесс. Результат чтения: %d\n", n);
        exit(0);
    }

    printf("Дочерний процесс прочитал: %c", c);
    exit(0);
}

write(fd[1], "p", 1);
if ((n = read(fd[1], &c, 1)) != 1) {
    printf("Родительский процесс. Результат чтения: %d\n", n);
    exit(0);
}

printf("Родительский процесс прочитал: %c", c);
exit(0);

return 0;
}


Но при выполнении родительский процесс возвращает -1.

В каком месте может быть ошибка?
И может ли данный пример подойти в качестве решения для задачи?

Если нет, то какое решение может быть?
  • Вопрос задан
  • 99 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
В каком месте может быть ошибка?

man pipe: писать можно только в fd[1], читать -- только из fd[0].
Канал однонаправленный, т.е. для двунаправленной коммуникации нужно открывать два канала.
Должно быть так:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h> 

int main(int argc, char **argv) {

        int fd0[2], fd1[2], n;
        char c;
        pipe(fd0);
        pipe(fd1);

        if (!fork()) {
                close(fd0[0]);
                close(fd1[1]);

                write(fd0[1], "c", 1);

                sleep(1);

                if ((n = read(fd1[0], &c, 1)) != 1) {
                        printf("Дочерний процесс. Результат чтения: %d\n", n);
                        exit(0);
                }

                printf("Дочерний процесс прочитал: %c\n", c);
                exit(0);
        }
        close(fd1[0]);
        close(fd0[1]);
                                                                                                                                                                                                                                                                          
        write(fd1[1], "p", 1);
        if ((n = read(fd0[0], &c, 1)) != 1) {
                printf("Родительский процесс. Результат чтения: %d\n", n);
                exit(0);
        }

        printf("Родительский процесс прочитал: %c\n", c);
        exit(0);

        return 0;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы