繁体   English   中英

在 C 中的 shell 实现中的管道

[英]piping in shell implementation in C

我正在用 C 实现一个 shell。这是我用于管道的函数。 当我在代码中放入“ls | a”时(即通过管道将有效命令与无效命令连接起来),它不会像它应该的那样退出子进程。 我如何让它回到主功能? 当我做 ps 时也会发生同样的事情 | ls 或 ps | pwd 等,但 ls | ps 的工作方式与 bash 相同。 我知道 ls | ps 或 ps | ls 没有意义,但至少它们应该提供与 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);
    }  
}

您已经接近解决方案了。 看看popen() 如何 实现的,这就是你想要做的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM