1

对于一个任务,我们需要实现一个带有重定向和管道的基本 shell。我的管道代码退出程序并且不再要求用户输入。管道在函数中执行,因此基本上控制不会返回给 main。我该如何做到这一点?这是我的代码:

void execute_pipe(char **argv,char **args)
{

    int pfds[2];
    pid_t pid;
    int status;
    pipe(pfds);
    if ((pid = fork()) < 0) {    
          printf("*** ERROR: forking child process failed\n");
          exit(1);
     }
    printf("here");
    if (pid==0) {
        close(1);      
        dup(pfds[1]);   
        close(pfds[0]); 
           if(execvp(argv[0],argv)<0){
            printf("**error in exec");

        }

    } 
    else {
    while (wait(&status) != pid)  ;  
        close(0);      
        dup(pfds[0]);   
        close(pfds[1]); 

           if(execvp(args[0],args)<0){
            printf("**error in exec");
        }
    }

}
4

1 回答 1

1

如果您dup()或管道连接到标准输入或标准输出,则应在使用管道或其亲属之一dup2()之前关闭管道的两个文件描述符。execvp()添加:

close(pfds[1]);

到子代码。

在您运行父进程之前,子进程必须死掉(因为您wait()处于循环中)。请注意,您应该检查wait()不返回诸如 ECHILD 之类的错误;如果是这样,您将不会超越循环。同样,您应该关闭两个管道文件描述符。

请注意,如果子进程生成的数据超出管道的容量,则子进程将被阻止写入管道,而父进程将被阻止等待子进程死亡——死锁。


如何让它返回主而不退出?

main()除非孩子或父母未能execvp()执行给定的命令,否则您无法返回该代码。你很可能需要一个额外fork()的在那里。

并且等待通常由父进程完成,而不是由两个孩子之一完成。

于 2012-11-16T08:27:53.663 回答