B********s 发帖数: 3610 | 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的结果一样。
请大牛帮我找找原因吧,说得比较乱,还请见谅。 | m***t 发帖数: 254 | 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的结果一样。 : 请大牛帮我找找原因吧,说得比较乱,还请见谅。
| B********s 发帖数: 3610 | 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.
|
|