fgetc阻塞:从管道读取时出现问题

3
我想要能够分叉一个进程,并使用管道使子进程和父进程之间建立双向链接。我创建了两个管道,使父进程从第一个管道的末端读取并写入第二个管道的开头,反之亦然,但我遇到了一些问题。
以下是代码简化版(省略了错误检查):
void PlayGame(int in, int out, int first, int id){  
    FILE *inStream = fdopen(in, "r");
    FILE *outStream = fdopen(out, "w");

    if (first) fputc( id, outStream);
    while(1){
        int c = fgetc(inStream);
        printf("process %d has read %d\n", id, c);
        fputc( id, outStream);
    }
}


int main (void){
    int fd[2];
    int fd1[2];
    pipe(fd);
    pipe(fd1);

    pid_t pid = fork();

    if (pid == 0){
        PlayGame(fd[0], fd1[1], 0, 1);
        exit(0);
    }
    PlayGame(fd1[0], fd[1], 1, 2);
    exit(0);
}

我想实现的是父进程向管道写入一个字符,子进程等待接收字符,然后写出响应并再次等待父进程。但是在这里我做错了什么?
无论是父进程还是子进程都会在第一次调用时被卡住。
int c = fgetc(inStream);
1个回答

5

stdio(fputc等)默认情况下是带缓冲区的,这意味着 fputc() 实际上并没有将字节写入管道,而是将其存储在内存中,在缓冲区稍后被刷新时再写出。

您可以在 fputc 后执行 fflush(outStream),或者在 fdopen 后执行 setvbuf(outStream, NULL, _IONBF, 0); 来关闭该文件的缓冲区。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接