0

パイプとファイル リダイレクトをサポートする単純なシェルを作成しようとしています。これまでに思いついた実行関数は次のとおりです。

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);
        }
    }
}

これを実行すると、プログラムは実行されますが、何も起こりません。私はこの機能に何日も取り組んできましたが、その理由を理解できないようです。親プロセスは子を永遠に待っていると思います。誰かがこれで私を助けてくれますか?

4

0 に答える 0