LinuxForum.Fans
Тема

bidirectional pipe

Автор: unk 2 сообщений 1356 просмотров
#137297

Пытаюсь сделать так, чтоб родительский и дочерний процесс общались чз пайп

text

#include <sys/types.h>
#include <unistd.h>
#include <wait.h>

#include <stdio.h>

#define FD_READ_END 0 #define FD_WRITE_END 1

int p2c[2]; int c2p[2];

int main() { pipe(p2c); pipe(c2p); pid_t cpid; if ((cpid = fork()) == 0) { close(p2c[FD_WRITE_END]); close(c2p[FD_READ_END]); for (int i=0; i<5; ++i) { FILE *r_stream = fdopen(p2c[FD_READ_END], "r"); FILE *w_stream = fdopen(c2p[FD_WRITE_END], "w"); char buf[1024]; fprintf(stdout, "CHILD: waiting for request from parent\n"); fflush(stdout); fgets(buf, sizeof(buf), r_stream); fprintf(stdout, "CHILD: geted request from parent \"%s\"\n", buf); fprintf(stdout, "CHILD: sending reply\n"); fflush(stdout); fprintf(w_stream, "reply on mes - %s", buf); fflush(w_stream); } } else { close(p2c[FD_READ_END]); close(c2p[FD_WRITE_END]);

FILE *r_stream = fdopen(c2p[FD_READ_END], "r"); FILE *w_stream = fdopen(p2c[FD_WRITE_END], "w"); char buf[1024]; for (int i=0; i<5; ++i) { fprintf(stdout, "PARENT: send to children mes #%d\n", i+1); fflush(stdout); fprintf(w_stream, "mes #%d from parent", i+1); fflush(w_stream); fprintf(stdout, "PARENT: waiting for reply on mes #%d\n", i+1); fflush(stdout); fgets(buf, sizeof(buf), r_stream); fprintf(stdout, "PARENT: geted reply from children on mes #%d: \"%s\"\n", i+1, buf); fflush(stdout); } } int status; wait(&status); return 0; }

Но дочерний процесс блокируется на строчке чтения данных от родителя, а родитель на строчке чтения данных от потомка. После каждой записи вызываю fflush, вроде все должно работать. Что не так?

#137646

1) завершать строки, которые посылаете /n
2) в потомке вынести инициализацию r_stream. w_stream и buf из цикла.

Войдите или зарегистрируйтесь, чтобы ответить.