在C中的shell实现中的管道

时间:2012-11-16 18:41:42

标签: c shell pipe

我在C中实现了一个shell。这是我用于管道的功能。当我在代码中放入“ls | a”时(即管道一个有效命令与无效命令),它不会像它应该的那样退出子进程。我如何让它回到主要功能? 当我做ps |时,同样的事情发生了ls或ps | pwd等但是ls | ps与bash中的工作方式相同。我知道ls | ps或ps |没有意义,但至少他们应该提供与bash相同的输出。

void exec3(char **args, char **args2){
    int fd[2];
    pid_t pid,pid1;
    int status;
    pipe(fd);
    int e=0;
    if ((pid = fork()) < 0) {    
        printf("*** ERROR: forking child process failed\n");
        exit(1);
    }

    else if ((pid1 = fork()) < 0) {    
        printf("*** ERROR: forking child process failed\n");
        exit(1);
    }

    else if (pid == 0 && pid1!=0){   
        printf("in 1\n");
        close(1);
        dup(fd[1]);
            close(fd[0]);
        close(fd[1]);

            if(execvp(args[0],args)<0){
                printf("**error in exec");
                close(fd[0]); 
                close(fd[1]);           
                exit(1);
            }
    //printf("exiting 1\n");
    exit(0);
}

else if (pid1 == 0 && pid!=0) {   
    printf("in 2\n");
    close(0);
    dup(fd[0]);
    close(fd[1]);
    close(fd[0]);
    if((e=execvp(args2[0],args2))<0){
            printf("**error in exec2 ");
            close(fd[0]);
            close(fd[1]);

        exit(1);
    }
    exit(0);
}

else {  
        close(fd[0]);
        close(fd[1]);
        fflush(stdout) ;             
        while (wait(&status) != pid);
        while (wait(&status) != pid1);
    }  
}

1 个答案:

答案 0 :(得分:-1)

您接近解决方案。看看popen() is implemented的方式,这就是你要做的事情。