C管道操作失败

时间:2013-10-22 19:20:26

标签: c pipe dup2

我正在尝试实现一个简单的shell。管道不工作,因为,第二个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);

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不是null ...实际上包含了一些东西。我已经尝试了一切...但我无法弄清楚为什么它不起作用。

结果如下:

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

EDIT !!! 我只是意识到,由于某种原因,它永远不会进入案例0.叉子不会失败..但它只是永远不会进入案例0.为什么会这样?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

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