Linux 父子过程中用管子说话,挂在“后”;execlp";,为什么?

Linux 父子过程中用管子说话,挂在“后”;execlp";,为什么?,linux,process,pipe,fork,freeze,Linux,Process,Pipe,Fork,Freeze,我在当前目录下有一个名为“tmp”的简单文本文件,我想“cat”这个文件,然后对它进行“排序”,我想用一个c程序来充当管道“|”,所以我试着用一个父/子对话来做这件事 出乎意料的是,程序在“cat”之后挂起,如下所示: #include<stdlib.h> #include<stdio.h> #include<unistd.h> int main(){ int pipefd[2]; pipe(pipefd); int& read

我在当前目录下有一个名为“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;
}
#包括
#包括
#包括
int main(){
int-pipefd[2];
管道(pipefd);
int&readfd=pipefd[0];
int&writefd=pipefd[1];
pid_t pid=fork();
如果(pid==0){//child
dup2(标准文件号,writefd);
关闭(readfd);
execlp(“cat”、“cat”、“tmp”、NULL);
printf(“子类结束\n”);
出口(0);
}否则{//父亲
dup2(标准输出文件号,readfd);
关闭(writefd);
execlp(“排序”,“排序”,空);
printf(“父排序结束\n”);
}
智力状态;
等待(&状态);
printf(“父亲存在”\n);
返回0;
}
编译并运行这个文件,在“cat”这个文件之后,我甚至没有看到“child cat ends”,它只是挂起

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

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

2) 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;
 }
#包括
#包括
#包括
int main(){
int-pipefd[2];
管道(pipefd);
int&readfd=pipefd[0];
int&writefd=pipefd[1];
pid_t pid=fork();
如果(pid==0){//child
dup2(writefd,1);//1是标准输出文件否——cat已经有输入——需要输出
关闭(readfd);
execlp(“cat”、“cat”、“tmp.txt”、NULL);
perror(“execlp()在子项中失败”);
}否则{//父亲
dup2(readfd,0);//0是标准的文件号——因为排序需要输入!
关闭(writefd);
execlp(“排序”,“排序”,空);
perror(“execlp()在父级中失败”);
}
返回0;
}