gpt4 book ai didi

c - 管道和 fork ,不显示在标准输出上

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:11:06 25 4
gpt4 key购买 nike

我正在做我的家庭作业,即在 C 中复制 unix 命令 shell。

我已经实现了在后台运行 (&) 的情况下执行单个命令。

现在我正处于实现管道的阶段,我面临这个问题,对于大于 1 的管道,带有管道的子命令已完成,但最终输出没有显示在 stdout 上(最后一个命令的 stdin 是替换为读取最后一个管道)

dup2(pipes[lst_cmd], 0);

我也在父节点上尝试了 fflush(STDIN_FILENO)

我的程序的退出是 CONTROL-D,当我按下它时,会显示输出(也退出,因为我对 CONTROL-D 的操作是退出(0))。

我认为 pipe 的输出在标准输出缓冲区中,但没有显示出来。除了 fflush 之外,还有其他方法可以将缓冲区中的内容获取到 stdout 吗?

最佳答案

看过代码(不公平的优势),主要问题是进程结构结合没有彻底关闭管道。

管道的进程结构ps |排序 是:

main shell
- coordinator sub-shell
- ps
- sort

主 shell 正在创建 N 个管道(N = 1 for ps | sort)。然后创建了协调器外壳;它将启动 N+1 个 child 。但是,它没有等待它们终止,也没有关闭它的管道副本。主 shell 也没有关闭它的管道副本。

更正常的进程结构可能没有协调器子外壳。有两种生成 child 的机制。通常,主 shell 会 fork 一个子进程;它将协调管道中的前 N ​​个进程(包括首先创建管道),然后执行管道中的最后一个进程。主 shell 等待一个子进程完成,管道的退出状态是子进程(也就是管道中的最后一个进程)的退出状态。

最近,bash 提供了一种机制,通过该机制,主 shell 可以获取管道中每个子进程的状态;它负责协调。

主要修复(除了一些主要是次要的编译警告)是:

  1. 主 shell 在 fork 协调器后关闭所有管道。
  2. 主 shell 等待协调器完成。
  3. 协调器在 fork 管道后关闭所有管道。
  4. 协调器等待管道中的所有进程完成。
  5. 协调员退出(而不是返回以提供决斗双重提示)。

更好的修复方法是消除协调器子外壳(它的行为类似于所描述的经典系统)。

关于c - 管道和 fork ,不显示在标准输出上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13552236/

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