gpt4 book ai didi

即使在关闭其输入后,子进程也会挂起

转载 作者:行者123 更新时间:2023-11-30 14:51:33 26 4
gpt4 key购买 nike

假设我有这个示例代码(为了清楚起见,很大程度上省略了错误检查)

static void c_way() {
int pipefd[2], ch;
FILE *rf, *wf;
pipe(pipefd);
switch (fork()) {
case -1:
/* something went wrong */
break;
case 0:
dup2(pipefd[0], STDIN_FILENO);
dup2(pipefd[1], STDOUT_FILENO);
close(pipefd[0]);
close(pipefd[1]);
execvp(cat_args[0], cat_args);
_exit(0);
}
rf = fdopen(pipefd[0], "r");
wf = fdopen(pipefd[1], "w");
fprintf(wf, "I have %d apples.\n", 5);
fclose(wf);
while ((ch = fgetc(rf)) != EOF)
putchar(ch);
puts("Done reading.");
fflush(stdout);
fclose(rf);
}

其中 cat_args 只是 {"cat", "-", NULL}。由于某种原因,尽管已经关闭了父进程的管道写入端,但在 fgetc 循环中似乎永远不会到达 EOF,就好像子进程正在等待更多输入一样。我是否忘记关闭一些文件描述符?即使不使用文件指针(即原始 POSIX 读取和写入),它仍然会挂起。

我看到一些类似的已回答问题,因此这可能是重复的。

最佳答案

当我运行此代码时,我看到:

[notroot]$ ./c_way 
I have 5 apples.

然后挂起。

这是一场竞赛:您的父进程在子进程 exec 的 cat 之前从管道读取自己刚刚写入的数据(并将其写入标准输出)。

子进程什么也没读——管道已被父进程排空——因此耐心地阻塞在标准输入上等待输入。与此同时,父级耐心地阻塞在管道的读取端,等待永远不会到达的输入。

您需要两个管道:一个将父级连接到子级标准输入,另一个将子级标准输出连接到父级。 (另请参阅socketpair。)

关于即使在关闭其输入后,子进程也会挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48196232/

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