我正在做我的家庭作业,那就是用C语言复制unix命令shell。
我已经实现了在后台运行(&)的情况下执行单个命令。
现在我正处于实现管道的阶段,我面临着这个问题,对于大于1的管道,带管道的子命令已经完成,但最终的输出不会显示在stdout上(最后一个命令的stdin被替换为read of last Pipe.)
dup2(pipes[lst_cmd], 0);我也在家长那里试过fflush(STDIN_FILENO)。
我的程序的出口是CONTROL-D,当我按下它时,输出就会显示出来(也会退出,因为我在CONTROL-D上的操作是退出(0))。
我认为管道的输出在stdout缓冲区中,但是没有显示出来。除了fflush之外,是否还有其他方法可以将缓冲区中的内容转换为stdout?
发布于 2012-11-26 01:02:59
在看到代码(不公平的优势)后,主要的问题是流程结构与没有彻底关闭管道。
管道ps | sort的进程结构为:
main shell
- coordinator sub-shell
- ps
- sort主shell创建了N个管道(对于ps | sort,N=1)。然后创建协调器外壳;它将启动N+1子代。然而,它没有等待它们终止,也没有关闭它的管道副本。主壳也没有关闭它的管道副本。
更普通的进程结构可能不需要协调器子shell。生成子对象有两种机制。传统上,主shell将派生一个子进程;它将协调管道中的前N个进程(包括首先创建管道),然后执行管道中的最后一个进程。主shell等待一个子进程完成,管道的退出状态是子进程的退出状态(也称为管道中的最后一个进程)。
最近,bash提供了一种机制,通过该机制,主shell可以获取管道中每个子进程的状态;它负责协调。
主要的修复(除了一些主要是次要的编译警告)是:
分叉后coordinator.
更好的修复方法是消除协调器子shell(它的行为类似于所描述的经典系统)。
https://stackoverflow.com/questions/13552236
复制相似问题