1

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

#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, вроде все должно работать. Что не так?

2

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

95% процентов проблем находятся между клавиатурой и стулом.