1

我正在尝试实现一个简单的外壳。管道不起作用,因为第二个 execve(如果您想知道,我必须使用 execve,而不是 execvp),表示找不到该命令,或者它只是失败并退出。这是我的管道代码。

switch(fork()) {
case -1:
        fatal("1st Fork Failed In Pipe!");
case 0:
        break;
default:
        wait(&status);
        return(status);
}

if(pipe(pipe_line) == -1) {
    fatal("Pipe Failed!");
}

switch(fork()) {
case -1:
        fatal("2nd Fork Failed In Pipe!");
case 0:
        dup2(pipe_line[1], 1);
        close(pipe_line[0]);
        close(pipe_line[1]);
        execv(cmd[0].name, cmd[0].argv);
        fatal("1st Execv Failed!");
default:
        dup2(pipe_line[0], 0);
        close(pipe_line[0]);
        close(pipe_line[1]);
        execv(cmd[1].name, cmd[1].argv);
        fatal("2nd Execv Failed!");
}

fflush(stdout);

注意:1.我已经测试以确保 cmd[1].name 是正确的......这样它就是正确的目录。并且 cmd[1].argv 不是空的......实际上包含一些东西。我已经尝试了一切......但我无法弄清楚为什么它不起作用。

这是结果:

ls | wc
wc: invalid zero-length file name
wc: ���|")�:ʊЪ8�m���1��a�������K�!���*"ks8���$: No such file or directory
wc: �]S�: No such file or directory
wc: invalid zero-length file name
wc: &�be: No such file or directory
wc: ����: No such file or directory
wc: T: No such file or directory
0 0 0 total

编辑!!!我刚刚意识到,出于某种原因,它永远不会进入案例 0。fork 不会失败..但它永远不会进入案例 0。为什么会这样?

非常感谢您的帮助!

4

1 回答 1

1

看起来您的数据nameargv数据确实已损坏。考虑运行一个简单的测试:将execve调用替换printf为打印命令和argv每个孩子的(通过调用sleep()其中一个孩子将它们分开)。

于 2013-10-22T20:17:26.097 回答