递归函数运行多个管道

时间:2015-12-25 10:11:55

标签: c linux recursion piping

我试图弄清楚为什么我的功能不起作用。 我在c中编写了一个递归函数,它执行在字符串数组中提供的管道命令。但由于某种原因,命令不会执行。

int run_piped_recursive(int index, char** arglist, int writefd){
    printf("entered recursive piping %d\n", index);
    while(index != 0){
        if(strcmp(arglist[index],"|") == 0){
            arglist[index] = NULL;

            int pipesfd[2];
            if(-1 == pipe(pipesfd)){
                printf("Error creating pipe when trying to run %s piped.\nerrno:%d\nError:%s\n", arglist[index +1], errno, strerror(errno));
                return -1;
            }

            int child_pid = fork();
            if(child_pid < 0){
                printf("Error executing fork when trying to run %s piped.\nerrno:%d\nError:%s\n", arglist[index +1], errno, strerror(errno));
                return -1;
            }

            if(child_pid == 0){
                close(pipesfd[0]);
                run_piped_recursive(--index, arglist, pipesfd[1]);
                exit(0);
            }
            else{
                if(writefd != 1) {
                    if (-1 == dup2(writefd, STDOUT_FILENO)) {
                        fprintf(stdout, "Error while trying to duplicate fd when running %s piped.\nerrno:%d\nError:%s\n", arglist[index + 1], errno, strerror(errno));
                        return -1;
                    }
                    close(writefd);
                }

                close(pipesfd[1]);
                if(-1 == dup2(pipesfd[0], STDIN_FILENO)){
                    fprintf(stderr, "Error while trying to duplicate fd when running %s piped.\nerrno:%d\nError:%s\n", arglist[index +1], errno, strerror(errno));
                    return -1;
                }
                close(pipesfd[0]);

                pthread_t wait_child_thread;
                if (-1 == pthread_create(&wait_child_thread, NULL, wait_pid_func, &child_pid)) { 
                    fprintf(stderr,"Error waiting for process with pid %d, running %s.\nerrno:%d\nError:%s\n", child_pid, arglist[0], errno, strerror(errno));
                }


                if(-1 == execvp(arglist[index + 1], (arglist + index + 1) )){
                    fprintf(stderr, "Error running the command %s.\nerrno:%d\nError:%s\n", arglist[0], errno, strerror(errno));
                    return -1;
                }
            }
        }
        index--;
    }
    if(1 != writefd) {
        printf("in if %d\n", writefd);
        if (-1 == dup2(writefd, STDOUT_FILENO)) {
            fprintf(stderr,"Error while trying to duplicate fd when running %s piped.\nerrno:%d\nError:%s\n", arglist[index +1], errno,
               strerror(errno));
            return -1;
        }
        close(writefd);
    }

    if(-1 == execvp(arglist[index], arglist )){
        fprintf(stderr,"Error running the command %s.\nerrno:%d\nError:%s\n", arglist[0], errno, strerror(errno));
        return -1;
    }
}

我已经向函数传递了以下参数:arglist的大小减去1(最后一个字符串的索引),arglist,STDOUT_FILENO。

当arglist是{&#34; ls&#34; &#34; |&#34; &#34; grep的&#34; &#34;&#34; }。该函数似乎运行但没有任何东西被打印到stdout我也试过而不是创建一个线程来等待孩子完成我现在正在使用waitpid。似乎这个过程正在运行&#34; ls&#34;以及运行&#34; grep&#34;完成(程序在调试后继续运行)但没有任何内容正在打印到stdout。

0 个答案:

没有答案