父子进程使用管道通话,挂起“execlp”后,为什么?

时间:2017-03-05 07:28:26

标签: linux process pipe fork hang

我在当前目录下有一个名为“tmp”的简单文本文件,我希望“cat”这个文件然后“排序”它,我想使用一个c程序就像管道“|”所以我试着用父亲/小孩的谈话来做这件事。

出乎意料的是,程序在“cat”之后挂起,如下所示:

#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
int main(){
    int pipefd[2];
    pipe(pipefd);
    int& readfd=pipefd[0];
    int& writefd=pipefd[1];

    pid_t pid=fork();
    if(pid==0){//child
        dup2(STDIN_FILENO,writefd);
        close(readfd);
        execlp("cat","cat","tmp",NULL);
        printf("child cat ends\n");
        exit(0);
    }else{//father
        dup2(STDOUT_FILENO,readfd);
        close(writefd);
        execlp("sort","sort",NULL);
        printf("father sort ends\n");
    }
    int status;
    wait(&status);
    printf("father exists\n");
    return 0;
}

g ++编译并运行此文件,在“cat”文件之后,我甚至看不到“孩子猫尾”,它只是挂起。

问题出在哪里,如何解决? 感谢

1 个答案:

答案 0 :(得分:1)

1)dup2中的参数顺序不正确。看dup2

2)参数(stdin / stdout)到dup2不正确。

3)exec()系列函数用新的替换过程映像。所以调用之后的代码不会运行(除非exec()失败),所以我删除了那些。

以下是代码:

 #include <stdlib.h>
 #include <stdio.h>
 #include <unistd.h>

 int main(){
   int pipefd[2];
   pipe(pipefd);
   int& readfd = pipefd[0];
   int& writefd = pipefd[1];

   pid_t pid = fork();

   if(pid == 0){ //child
     dup2(writefd, 1);  // 1 is STDOUT_FILENO -- cat already has input -- needs output
     close(readfd);
     execlp("cat","cat","tmp.txt", NULL);
     perror("execlp() failed in child");

   }else{ //father
     dup2(readfd, 0); // 0 is STDIN_FILENO -- because sort needs input!
     close(writefd);
     execlp("sort","sort", NULL);
     perror("execlp() failed in parent");
   }
   return 0;
 }