【发布时间】:2020-01-05 17:52:10
【问题描述】:
我已经成功地为我的 minishell 创建了一个抽象语法树,事情是这样的 当我尝试执行管道命令时,我卡住了。
第一个管道执行并将结果输出到标准输出 1,而第二个 grep 文件名要么卡住要么根本不执行。
我尝试了不同的方法,得到了不同的结果,但没有一个主题有效
我将不胜感激。
这就是我的 AST 的样子。
ls -la | cat -e | grep filename
t_node *pipe_execution(t_node *node, t_list *blt, t_line *line, int std[2])
{
int pp[2];
if (node)
{
if (node->kind == NODE_PIPE)
{
if (node->and_or_command->left)
{
pipe(pp);
std[1] = pp[1];
pipe_execution(node->and_or_command->left, blt, line, std);
close(pp[1]);
}
if (node->and_or_command->right)
{
std[0] = pp[0];
std[1] = 1;
dprintf(2, "right std %d\n", std[1]);
pipe_execution(node->and_or_command->right, blt, line, std);
close(std[0]);
}
} else if (node->kind == NODE_SIMPLE_COMMAND)
{
dprintf(2, "====%s=== and stdin %d stdout %d\n", node->simple_command->head->name, std[0], std[1]);
execute_shell(blt, line->env, node, std);
}
}
return (node);
}
int execute_shell(t_list *blt, t_list *env, t_node *node, int std[2])
{
...
return (my_fork(path, env, cmds, std));
}
我的 fork 过程的实现。
int my_fork(char *path, t_list *env, char **cmds, int std[2])
{
pid_t child;
char **env_tab;
int status;
status = 0;
env_tab = env_to_tab(env);
child = fork();
if (child > 0)
waitpid(child, &status, 0);
else if (child == 0)
{
dup2(std[0], 0);
dup2(std[1], 1);
execve(path, cmds, env_tab);
}
return (status);
}
我希望这段代码有意义。
【问题讨论】:
-
怎么了?应该发生什么以及实际发生了什么?你能把它做成一个可编译的例子吗?
-
第一个管道执行并将结果输出到标准输出 1,而第二个管道
grep filename要么卡住要么根本不执行,因为我尝试了不同的方法。 -
你可以请edit那个问题吗?
-
我已经这样做了,你知道如何在走树的同时执行管道吗?
标签: c shell pipe fork abstract-syntax-tree