在未知数量的进程之间进行流水线操作

时间:2014-12-07 07:11:44

标签: c unix pipeline

根据我的理解,我不需要知道前面的管道数量(尽管我可以,我使用链表实现它)。我有一个名为cmdLine的结构:

typedef struct cmdLine
{
    char* const arguments[MAX_ARGUMENTS];
    int argCount;
    char const *inputRedirect;
    char const *outputRedirect;
    char blocking;
    int idx;
    struct cmdLine *next;
} cmdLine;

这是执行的功能(只有代码的一部分重要):

void execute(cmdLine *pCmdLine)
{
    int status = 0;
    int fd[2];
    pid_t id;

    if(pCmdLine->next)
    {
        if(pipe(fd) == -1)
        {
            perror("Error opening pipe.\n");
            exit(1);
        }
        if(pCmdLine->idx == 0)
        {
            dup2(fd[1], 1);
            close(1);
            close(fd[0]);
        }
        else
        {
            dup2(fd[0], 0);
            close(0);
            dup2(fd[1], 1);
            close(1);
        }
        execute(pCmdLine->next);
        close(fd[0]);
        close(fd[1]);
        waitpid(id, &status, 0);
    }

    id = fork();

    if(id == 0)
    {
        if(execvp(pCmdLine->arguments[0], pCmdLine->arguments) == -1)
        {
            perror("execvp failed.\n");
            exit(1);
        }
        close(fd[0]);
        close(fd[1]);
        exit(0);
    }
    if(pCmdLine->blocking)
    {
        waitpid(id, &status, 0);
    }
    if(pCmdLine->next)
    {
        execute(pCmdLine->next);
        close(fd[0]);
        close(fd[1]);
    }
}

基本上,如果它是第一个命令我关闭输入管道(因为它无法获得任何输入)并将fd[1]替换为stdout所以当我激活{ {1}}下一次从前一个命令执行输入并且输出进入下一个命令,直到它是最后一个命令 - 当它只获得输入并关闭输出管道时。我不明白问题出在哪里,当我输入类似execvp()的东西时,它打印出WHOLE文件夹的长列表,然后它被卡住(好像得到了输入 - 虽然我输入了很多输入和准备分段错误没有任何反应。)

有什么问题?我该如何解决?我想我根本没有朝着正确的方向前进,我真的需要帮助。

0 个答案:

没有答案