首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >管道和Forks不会显示在标准输出上

管道和Forks不会显示在标准输出上
EN

Stack Overflow用户
提问于 2012-11-25 23:04:56
回答 1查看 396关注 0票数 2

我正在做我的家庭作业,那就是用C语言复制unix命令shell。

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

现在我正处于实现管道的阶段,我面临着这个问题,对于大于1的管道,带管道的子命令已经完成,但最终的输出不会显示在stdout上(最后一个命令的stdin被替换为read of last Pipe.)

代码语言:javascript
复制
dup2(pipes[lst_cmd], 0);

我也在家长那里试过fflush(STDIN_FILENO)

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

我认为管道的输出在stdout缓冲区中,但是没有显示出来。除了fflush之外,是否还有其他方法可以将缓冲区中的内容转换为stdout?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-26 01:02:59

在看到代码(不公平的优势)后,主要的问题是流程结构与没有彻底关闭管道。

管道ps | sort的进程结构为:

代码语言:javascript
复制
main shell
    - coordinator sub-shell
        - ps
        - sort

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

更普通的进程结构可能不需要协调器子shell。生成子对象有两种机制。传统上,主shell将派生一个子进程;它将协调管道中的前N个进程(包括首先创建管道),然后执行管道中的最后一个进程。主shell等待一个子进程完成,管道的退出状态是子进程的退出状态(也称为管道中的最后一个进程)。

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

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

分叉后coordinator.

  • main shell等待协调器complete.

  • coordinator关闭所有管道pipeline.

  • coordinator complete.

  • coordinator等待管道中的所有进程退出(而不是返回以提供双重提示)
  1. 主shell将关闭所有管道。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13552236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档