0

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

例如,我将 ls|more|grep 插入到我的命令列表中。

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);

}
4

1 回答 1

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;
于 2013-10-01T04:28:49.903 回答