Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C管道标准件至叉子_C_Linux_Shell_Pipe_Fork - Fatal编程技术网

C管道标准件至叉子

C管道标准件至叉子,c,linux,shell,pipe,fork,C,Linux,Shell,Pipe,Fork,我正试图编写一个C程序,使用pipe和fork执行ls | wc,但我不知道我的代码出了什么问题。当我运行下面的代码时,不会返回任何内容 int main() { pid_t p1, p2; int fd1[2]; pipe(fd1); p1 = fork(); if (p1 == 0) { close(STDOUT_FILENO); dup2(fd1[1], STDOUT_FILENO); close(

我正试图编写一个C程序,使用pipe和fork执行
ls | wc
,但我不知道我的代码出了什么问题。当我运行下面的代码时,不会返回任何内容

int main() {
    pid_t p1, p2;
    int fd1[2];

    pipe(fd1);

    p1 = fork();
    if (p1 == 0) {
        close(STDOUT_FILENO);
        dup2(fd1[1], STDOUT_FILENO);
        close(fd1[0]);
        execlp("ls", "ls", (char *)NULL);
    } else {
        p2 = fork();

        if (p2 == 0) {
            dup2(fd1[0], STDIN_FILENO);
            close(fd1[0]);
            close(fd1[1]);

            execlp("wc", "wc", (char *)NULL);
        } else {
            waitpid(p2, 0, WUNTRACED);
            waitpid(p1, 0, WUNTRACED);
        }
    }

    return 0;
}

你没有清楚地解释这个程序在做什么,你认为是错误的。但是,当我自己运行这个程序时(在添加了适当的标题之后——将来,请不要忘记这些标题),它会一直挂起,直到我按下control-C。我假设这是您不想要的,您想要的是它打印
wc
的输出,然后退出

程序挂起,因为在调用
wait
时,父进程中的
fd1[1]
仍处于打开状态
wc
在所有引用管道写入端的文件描述符关闭之前,不会收到EOF指示。但是父进程在其两个子进程退出之前不会关闭管道的写端,而
wc
在获得EOF之前不会退出,因此会出现死锁


您需要将
close(fd1[1])
添加到第一个
if
的父端,紧靠
p2=fork()
之前。这足以打破僵局。您还应该将
close(fd1[0])
添加到第二个
if
的父端,紧跟在
waitpid
调用之前。您还应该检查所有操作是否有错误。

您说的“未返回任何内容”是什么意思?旁注:两个叉子后的不对称性有什么原因吗?一旦您关闭了要复制的文件描述符,另一次就不会了。还有为什么不在父进程中关闭管道文件描述符?将
0
作为第二个参数
int*status
传递到
waitpid
的原因是什么?