在我之前的许多人,我试图在C中实现一个基本的shell。总的来说工作得很好,我现在正试图添加管道和重定向。
我已经阅读了很多关于pipe()
函数的内容,并成功编写了一个辅助程序来将函数的输出传递给第二个函数的输入。
我遇到麻烦的地方是循环使用不确定数量的函数。
这是我的函数的最后一个版本以及我用来测试它的主要版本:
char **g_env;
int ft_pipeline(char **cmd, unsigned int pos)
{
int in;
int pfd[2];
pid_t pid;
char **cur_cmd;
in = 0;
while (cmd[pos])
{
if (pipe(pfd) != 0)
return (1);
close(pfd[0]);
dup2(pfd[1], in);
close(pfd[1]);
pid = fork();
if (pid == -1)
return (2);
if (pid == 0) //child
{
close(pfd[1]);
dup2(pfd[0], 0);
close(pfd[0]);
cur_cmd = ft_strsplit_blank(cmd[pos]);
execve(cur_cmd[0], cur_cmd, g_env);
}
wait(NULL);
in = pfd[0];
pos++;
}
return (0);
}
int main(void)
{
char **cmd = ft_strsplit("/bin/ls -l /dev | /bin/grep std", '|');
g_env = NULL;
ft_pipeline(cmd, 0);
return (0);
}
在当前形式中,ls已正确执行但写入stdout,而grep返回:
/ bin / grep :(标准输入):错误的文件描述符
这是我第五次重写我的代码,而且我已经尝试过几天调整它了。我还在这里阅读了其他几篇文章,试图掌握这个小程序背后的逻辑,但无济于事。
我真的很喜欢它,如果你能告诉我我犯了哪些错误以及如何解决它。
注意:您很可能会找到许多方法来改进其表单中的代码。我知道它,但在大多数情况下,这是我不能做的事情。虽然这不是作业,但它仍然是我为学校做的事情(看作是一种自愿的做法),我必须尊重标准,就像我编写代码或我使用的功能一样。