avatar
Linux shell编程的问题# Programming - 葵花宝典
B*s
1
正在试着实现一般简单的linux shell,目前正在处理I/O redirection和pipeline,基本
的想法是,比如这样一个命令行: command1|command2|command3, 由shell fork一个子
进程,使用exec函数调用'command1'命令,然后command1进程再fork一个子进程来调用
command2,同时建立一个pipe用于command1和command2的通信, ...... 这样就形成了
一个链状的进程体系,主进程(shell)是祖先,并且通过 waitpid(pid, NULL, 0)函数
等待其他进程结束然后继续(pid是第一次fork的返回值)。现在的问题是,各个
command的执行顺序比较混乱,比如执行 ls|sort,输出的结果是正确的,但是主进程在
结果显示之前就已经继续运行把命令行提示符显示出来了。还有,如果执行ls|sort;
who ,则who的结果会先显示出来,和执行who;ls|sort的结果一样。
请大牛帮我找找原因吧,说得比较乱,还请见谅。
avatar
m*t
2
post source code bah.

【在 B********s 的大作中提到】
: 正在试着实现一般简单的linux shell,目前正在处理I/O redirection和pipeline,基本
: 的想法是,比如这样一个命令行: command1|command2|command3, 由shell fork一个子
: 进程,使用exec函数调用'command1'命令,然后command1进程再fork一个子进程来调用
: command2,同时建立一个pipe用于command1和command2的通信, ...... 这样就形成了
: 一个链状的进程体系,主进程(shell)是祖先,并且通过 waitpid(pid, NULL, 0)函数
: 等待其他进程结束然后继续(pid是第一次fork的返回值)。现在的问题是,各个
: command的执行顺序比较混乱,比如执行 ls|sort,输出的结果是正确的,但是主进程在
: 结果显示之前就已经继续运行把命令行提示符显示出来了。还有,如果执行ls|sort;
: who ,则who的结果会先显示出来,和执行who;ls|sort的结果一样。
: 请大牛帮我找找原因吧,说得比较乱,还请见谅。

avatar
B*s
3
示意性代码如下:
parse() 函数返回一个pipeline p,包括多个command. execPipe()执行pipeline中的命
令。
static void execPipe(Pipe p)
{
int fds[2];
pid_t pid,parent;

if ((pid = fork()) <0)
exit(-1);
else if (pid == 0) { //child
for (all but the last command in this pipe) {

else if ((parent = fork()) == -1)
exit(-1);
else if (parent) { //parent process
dup2(fds[1],STDOUT_FILENO);
close(fds[0]);


【在 m***t 的大作中提到】
: post source code bah.
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。