gpt4 book ai didi

C从管道读取所有数据

转载 作者:行者123 更新时间:2023-11-30 15:04:53 25 4
gpt4 key购买 nike

我的程序创建子进程并设置管道与其通信。当我尝试从管道读取数据时出现问题。由于子进程已结束(我使用 wait 来确保),EOF 应该位于数据流的末尾,从而结束读取(如 pipe 的手册页中所示) 。但 read 只是卡住并等待更多数据的到来。我在这里缺少什么?

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



void setfd(int *in, int *out) {
dup2(out[1], 1);
dup2(in[0], 0);
}

int main(int argc, char *argv[]) {
int status;
int pipe2ch[2], pipe2pr[2];
char *newargv[] = {NULL, NULL};
newargv[0] = argv[1];

pipe(pipe2ch);
pipe(pipe2pr);

setfd(pipe2pr, pipe2ch);
int a;
if (!(a = fork())) {
setfd(pipe2ch, pipe2pr);
execve(newargv[0], newargv, NULL);
exit(1);
} else {
printf("hello!\n");
fflush(stdout);

char str;

wait(&status);
while (read(pipe2pr[0], &str, 1) > 0) {
fprintf(stderr, "%c", str);
}
exit(0);
}
}

最佳答案

Since child process has ended (i use wait to ensure that) EOF should be on the end of the data stream thus ending the read (As in the man page for pipe).

我不确定您读过什么内容来提出这一点。或者也许是你的措辞我不明白。 EOF 不是流上的字符。

But instead read just freezes and waits for more data to come. What am i missing here?

有几件事。最重要的一个可能是,当进程 fork 时,子进程的父进程打开文件描述符的副本引用与父进程相同的内核打开文件底层表中的条目,每个条目都保持打开状态,直到 all 其上的句柄已关闭。子进程退出时会关闭其所有文件描述符,但两个管道的两端在父进程中保持打开状态,因此不会向读者发出文件结束信号。每个进程必须关闭它不使用或已使用完毕的管道末端。

此外,您应该先read(),然后wait(),因为如果子进程向管道写入了足够的数据,那么它可能会阻塞,并且如果父级在子级退出之前不会读取,那么就会出现死锁。

此外,我没有看到任何理由将任一管道端复制到父级的标准流上(导致关闭原始流)。只需通过文件描述符来操作管道,就像您已经做的一半一样。如果您想要这些的流接口(interface),请使用 fdopen() 来获取。

关于C从管道读取所有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40116806/

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