我希望能够 fork 一个进程,并让 child 和 parent 使用管道建立双向链接。我创建了 2 个管道并使父级从第一个管道的末尾读取并写入第二个管道的开头,反之亦然,但我遇到了一些问题。

代码的简短版本在这里(省略错误检查)

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);
}

我想要实现的是,父级向管道写入一个字符,子级等待它接收到一个字符,然后写入其响应并再次等待父级。我在这里做错了什么?

parent 和 child 都在第一次打电话时卡住了
int c = fgetc(inStream);

最佳答案

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

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

关于c - fgetc 阻塞 : problem with reading from a pipe,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5056112/

10-11 20:55