C管道操作失败

C管道操作失败,c,pipe,dup2,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)

我正在尝试实现一个简单的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);

注: 1.我已测试以确保cmd[1]。名称正确无误。。。这样它就是正确的目录。而且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

编辑!!! 我只是意识到,出于某种原因,它从来没有进入案例0。Fork不会失败,但它永远不会进入case 0。为什么会这样


非常感谢你的帮助

看起来您的
名称
argv
数据确实已损坏。考虑运行一个简单的测试:替换<代码>执行> <代码>调用<代码> Prtff<代码>,打印每个孩子的命令和<代码> ARGV < /代码>(在其中一个孩子中调用“代码>睡眠”(< /代码>)。

< p>它看起来像你的<代码>名称<代码>和<代码> ARGV < /代码>数据被损坏。考虑运行一个简单的测试:替换<代码>执行> <代码>调用<代码> Prtff<代码>,打印每个孩子的命令和<代码> ARGV < /代码>(在其中一个孩子中调用“代码>睡眠”(< /代码>)。

您是否尝试在子进程中创建Prtf输出?调试多进程代码真的很痛苦。。。在调试器中通常只看到父进程或子进程:-/您是否尝试在子进程中创建printf输出?调试多进程代码真的很痛苦。。。在调试器中通常只能看到父进程或子进程:-/