如何解决用叉子处理几个管道
我必须做一个非常简单的 shell,它接受一个命令作为参数,例如:
Asym*0.3
命令总是有效的(没有语法错误),我只需要处理管道。 我已经让我的 ast 工作了,但我有执行部分的问题。 这是我的 ast 结构:
./a.out "/bin/ls" "|" "/usr/bin/grep/" "m" "|" "/usr/bin/grep" "u"
这是执行部分的代码:
struct s_ast
{
int t; // type (either PIPE or CMD)
t_ast *l; // left node (or NULL it t == CMD)
t_ast *r; // right node (or NULL it t == CMD)
char **c; // the command with its args (or NULL if t == PIPE)
};
它运行良好,对于每个简单的命令,我都得到了预期的结果,但是如果我给出一个包含很多管道的大命令,我会收到 void exe_pipe(t_ast *ast,char **env)
{
int fd[2],pid = 0;
if (pipe(fd) < 0 || (pid = fork()) < 0)
{
error(NULL,NULL);
}
if (pid == 0)
{
dup2(fd[1],STDOUT_FILENO);
close(fd[0]);
close(fd[1]);
exe(ast->l,env);
exit(0);
}
// EDIT: I don't fork anymore for the right side of a PIPE node
dup2(fd[0],STDIN_FILENO);
close(fd[1]);
close(fd[0]);
exe(ast->r,env);
waitpid(pid,NULL,0);
}
消息。为了测试它,我使用Error: fork error
来减少同时运行的最大授权进程数,并且我向程序传递了一个带有一百个管道的命令。
我尝试了几件事,但我不知道如何输入管道数超过最大允许进程数的命令。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。