子进程挂起,即使关闭其输入

莫娜莫纳德

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

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。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Perl父进程挂起,等待子进程读取标准输入

来自分类Dev

Perl:信号处理程序中的关闭子进程管道挂起?

来自分类Dev

Python子进程调用挂起?

来自分类Dev

Python子进程调用挂起?

来自分类Dev

没有挂起父进程的子进程

来自分类Dev

Python子进程因命名管道而挂起

来自分类Dev

Python子进程因命名管道而挂起

来自分类Dev

多次调用 std::cout 使子进程挂起

来自分类Dev

正常处理子进程关闭

来自分类Dev

为什么从分叉的子进程关闭 stdin 文件描述符后,父进程的 stdin 仍然接受输入?

来自分类Dev

关闭父进程(终端)不会关闭特定的子进程

来自分类Dev

在13.04中关机速度慢,在关闭进程时挂起

来自分类Dev

在13.04中关机速度慢,在关闭进程时挂起

来自分类Dev

使用子进程读取输入?

来自分类Dev

子进程管道终端输入?

来自分类Dev

在关闭输入流之前无法使进程执行

来自分类Dev

强制进程在挂起时忽略/丢弃累积的输入吗?

来自分类Dev

在子进程中关闭打开的套接字

来自分类Dev

Paramiko Sessions在子进程中关闭运输

来自分类Dev

为什么通过spawn()创建的Node子进程挂起?

来自分类Dev

通过python子进程sshing后,终端挂起

来自分类Dev

Linux:fork和execv,等待子进程挂起

来自分类Dev

Python子进程readline()挂起;不能使用普通选项

来自分类Dev

路由挂起中的Python3 Flask asyncio子进程

来自分类Dev

从scanadf脚本调用时pnmtops子进程挂起

来自分类Dev

从C子进程读取数据时Python挂起

来自分类Dev

如何捕获子进程的输入和输出?

来自分类Dev

子进程在命令后模拟用户输入

来自分类Dev

Python多处理:如果父进程被杀死,子进程会挂起吗?

Related 相关文章

热门标签

归档