我正在研究一个shell(是的,这是一个任务,所以我不是在寻找解决方案,更多的是指导和我做错的线索),而且我被卡住了用管道。我已经阅读了大量的教程,勒芒,什么不是,甚至复制粘贴了一些代码“#34;工作"”,似乎没有什么可以做到的。
这是我到目前为止所做的:
void ft_run_pipe(char **cmd, int num)
{
int i;
int j;
int piped[num][2];
pid_t pid;
i = 0;
j = 0;
while (i < num)
{
ft_putstr("Creating pipe");
ft_putnbr(i);
ft_putchar('\n');
if (pipe(piped[i]) < 0)
ft_putstrn("piped failed");
i++;
}
while (cmd[j] != '\0')
{
pid = fork();
if (pid == 0)
{
ft_putchar('a');
if (j != 0)
{
ft_putstrn("If not first");
ft_putnbr(j - 1);
if (dup2(piped[j - 1][0], 0) < 0)
{
ft_putstrn("dup1 failed");
ft_putstrn(strerror(errno));
}
close(piped[j - 1][1]);
close(piped[j - 1][0]);
}
if (j != num)
{
ft_putstrn("If not last");
ft_putnbr(j);
if (dup2(piped[j][1], 1) < 0)
{
ft_putstrn("dup2i failed");
ft_putstrn(strerror(errno));
}
close (piped[j][0]);
close (piped[j][0]);
}
i = 0;
while (i < num)
{
close(piped[i][0]);
close(piped[i][1]);
i++;
}
// ft_run_special(cmd[j], environ);
}
else
{
i = 0;
while (i < num)
{
close(piped[i][0]);
close(piped[i][1]);
i++;
}
}
j++;
}
wait (NULL);
}
各种ft_something函数由我编写一些libc函数的替代函数(ft_putstr写一个字符串,最后添加一个n,等等)。 ft_exec_special是一个用execve执行可执行文件的函数,在PATH变量中搜索。
当使用两个命令和一个管道运行时,它返回
Creating pipe0
aIf not last
0aIf not first
0dup1 failed
Bad file descriptor
虽然,通常,在我看来,它应该工作 - 管道[0] [0]存在,正确管道,并写入管道[0] [1] - 为什么它会说管道[0] [0]是一个糟糕的文件描述符?