多管道实施。不工作

时间:2013-10-01 02:44:53

标签: c shell pipe

我正在为我的shell实现多管道。代码的问题是它不会将管道中最后一个命令的输出打印到我的STDOUT。有人可以帮忙吗? executePipedCommands函数接受指向命令列表头部的指针

我正在插入例如ls | more | grep s到我的命令列表。

struct cmd_t {
int nargs, maxargs;     
char **args;        
struct cmd_t *next;
};
typedef struct cmd_t *Cmd;
 void executePipedCommands(Cmd command) {

    int numPipes = -1;
    Cmd temp = command;
    int status;
    int i = 0;
    pid_t pid;

    while(command!= NULL)
    {   
        numPipes ++;
        command = command->next;
    }
    printf("number of pipes : %d",numPipes);


    int pipefds[2*numPipes];

    for(i = 0; i < (numPipes); i++){
        if(pipe(pipefds + i*2) < 0) {
            perror("couldn't pipe");
            exit(EXIT_FAILURE);
        }
    }


    int j = 0;
    while(command) 
    {
        pid = fork();
        if(pid == 0) 
        {

            //if not last command
            if(command->next)
            {
                if(dup2(pipefds[j + 1], 1) < 0)
                {
                    perror("dup2");
                    exit(EXIT_FAILURE);
                }
            }

            //if not first command&& j!= 2*numPipes
            if(j != 0 )
            {
                if(dup2(pipefds[j-2], 0) < 0)
                {
                    perror(" dup2");///j-2 0 j+1 1
                    exit(EXIT_FAILURE);

                }
            }


            for(i = 0; i < 2*numPipes; i++)
            {
                    close(pipefds[i]);
            }

            if( execvp(*command->args, command->args) < 0 )
            {
                    perror(*command->args);
                    exit(EXIT_FAILURE);
            }
        }
        else if(pid < 0)
        {
            perror("error");
            exit(EXIT_FAILURE);
        }

        command = command->next;
        j+=2;
    }
    /**Parent closes the pipes and wait for children*/

    for(i = 0; i < 2 * numPipes; i++){
        close(pipefds[i]);
    }

    for(i = 0; i < numPipes + 1; i++)
        wait(&status);

}

1 个答案:

答案 0 :(得分:0)

您的代码会逐步浏览链接列表,从command开始并在到达结尾时停止,以计算所需的管道数量。不幸的是,您没有将列表重置回起点,因此您无法单步执行列表来执行命令,因为您已经在最后。

你可能想写:

int numPipes = -1;
Cmd temp = command;

while (temp != NULL)
{   
    numPipes++;
    temp = temp->next;
}
printf("number of pipes: %d\n", numPipes);

变量temp未被使用。或者你可以写:

int numPipes = -1;
Cmd temp = command;

while (command != NULL)
{   
    numPipes++;
    command = command->next;
}
printf("number of pipes: %d\n", numPipes);

command = temp;