c - 在 Unix C 中使用管道

标签 c shell pipe

<分区>

对于一项任务,我们需要实现一个带有重定向和管道的基本 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");
        }
    }

}

最佳答案

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

close(pfds[1]);

到子代码。

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

请注意,如果子进程生成的数据多于管道容纳的数据,则子进程将被阻塞写入管道,而父进程将被阻塞等待子进程死掉——死锁。


How to make it return to main without exiting?

您不能使该代码返回到 main()除非 child 或 parent 未能execvp()它给出的命令。你需要一个额外的 fork()在那里,很可能。

等待通常由父进程完成,而不是由两个子进程中的一个完成。

关于c - 在 Unix C 中使用管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13412676/

相关文章:

shell - 从 cypher neo4j-shell 向控制台输出状态消息

javascript - 延续传递风格与管道有什么不同吗?

c - 管道未发送准确信息

c - 一堆纸牌和 war 游戏

C 程序循环问题

c - 找不到标识符?

shell - 线程 “delete Spark local dirs”中的异常java.lang.NullPointerException

linux - 如何在 bash 中间接分配变量以从标准输入、文件和执行输出中获取多行数据

Powershell:管道外部命令输出到另一个外部命令

c - 关于在C中将 `void *`转换为 `int`的问题