使用for循环的多管道

时间:2014-02-10 20:33:01

标签: shell redirect fork pipe dup2

我正在尝试创建一个支持管道和文件重定向的简单shell。这是我到目前为止提出的执行功能:

void execute(std::vector<Command *> cmds)
{
    int inp[2], out[2];
    pipe(inp);
    pipe(out);
    int status, fd = 0;

    for (auto cmd : cmds)
    {
        auto pid = fork();

        if (pid == -1) {
            throw std::runtime_error("Could not fork.");
        } else if (pid == 0) {

            dup2(inp[1], 1);
            if (cmd->redirectout) {
                fd = fileno(fopen(cmd->filename.c_str(), "w"));
                dup2(1, fd);
            }

            dup2(out[0], 0);
            if (cmd->redirectin) {
                fd = fileno(fopen(cmd->filename.c_str(), "r"));
                dup2(0, fd);
            }

            close(inp[0]);
            close(inp[1]);
            close(out[0]);
            close(out[1]);

            if(execvp(cmd->args_char[0], cmd->args_char.data()) < 0) {
                std::cout << "Command not found." << std::endl;
                exit(1);
            }

        } else {

            dup2(out[0], inp[0]);

            dup2(out[1], inp[1]);

            close(inp[0]);
            close(inp[1]);
            close(out[0]);
            close(out[1]);

            while (wait(&status) != pid);
        }
    }
}

当我执行此程序时,程序正在运行但没有任何反应。我一直在研究这个功能好几天但似乎无法理解原因。我认为父进程正在等待孩子。有人可以帮帮我吗?

0 个答案:

没有答案