在C中使用Pipe,是|头陷入无限循环

时间:2019-03-23 20:51:17

标签: c pipe dup

遵循此问题问答

Connecting n commands with pipes in a shell?

我尝试执行yes | head,但它在无限循环中运行,或者它从不响应。有什么问题。

我确实做了一些更改,这是正在运行的代码

#include <unistd.h>

struct command
{
    const char **string;
};

助手功能

pid_t start(command* command, pid_t pid, int* status, int in, int out) {
    (void) pid;
    pid_t cpid;
    int childInt;

    cpid = fork();
    if (cpid == 0) {

        if (in != 0)
        {
            dup2(in, 0);
            close(in);
        }


        if (out != 1)
        {
            dup2(out, 1);
            close(out);
        }

            execvp(c->string[0], c->string);
            _exit(1);
        }

        waitpid(cpid, &childInt, 0);
    }


    *status = childInt;
    return c->pid;
}

以及我的主要功能

for(int i = 0; i < n; i++)
    //New command every loop
    int p = pipe(fd);
    if (p == 0)
    {
        start_command(c, 0, &status, in, fd[1]);
        close(fd[1]);
        in = fd[0];
    }
    continue;
}
dup2(in, 0);

1 个答案:

答案 0 :(得分:4)

如果要执行yes | head,则需要创建两个进程yeshead,并且需要将它们与管道连接。您没有执行此操作的代码,只需执行yes并将其传递给| head。这导致yes不断地输出"| head"

您不能仅将yes| head传递给execvp。您可以execvp一个shell并将其yes | head传递给它,因为shell具有创建管道,生成多个进程并将其正确连接的必要代码。