gpt4 book ai didi

c - fgetc 阻塞 : problem with reading from a pipe

转载 作者:行者123 更新时间:2023-12-04 12:20:19 25 4
gpt4 key购买 nike

我希望能够 fork 一个进程,并让子进程和父进程使用管道进行双向链接。我创建了 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 和它的 friend )在默认情况下是缓冲的,这意味着 fputc() 实际上并不将字节写入管道,而是将其存储在-稍后刷新缓冲区时要写出的内存。

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com