パイプとファイル リダイレクトをサポートする単純なシェルを作成しようとしています。これまでに思いついた実行関数は次のとおりです。
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);
}
}
}
これを実行すると、プログラムは実行されますが、何も起こりません。私はこの機能に何日も取り組んできましたが、その理由を理解できないようです。親プロセスは子を永遠に待っていると思います。誰かがこれで私を助けてくれますか?