多个dup2s,forks,pipe和exec的问题

时间:2014-01-26 12:34:01

标签: c exec fork pipe dup2

我正在研究一个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]是一个糟糕的文件描述符?

0 个答案:

没有答案