我正在尝试创建一个支持管道和文件重定向的简单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);
}
}
}
当我执行此程序时,程序正在运行但没有任何反应。我一直在研究这个功能好几天但似乎无法理解原因。我认为父进程正在等待孩子。有人可以帮帮我吗?