在linux中通过管道实现ls_wc
该代码使用linux下的gcc编译,通过该例子可以更好的理解进程间使用无名管道通信,本例子不太完美之处,是没有判断函数返回值,对于代码量比较大的话,要养成一个判断返回值的良好习惯。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
#include<sys/wait.h>
int main(int argc, char* argv[])
{
int i;
int pid;
int pipefd[2];
pipe(pipefd);
for(i = 0;i<2;i++){//创建两个子线程
pid = fork();
if(pid == 0){//子线程也会fork()线程,所以创建的子线程要让它跳出循环
break;
}
}
if(i == 0){//兄进程
close(pipefd[0]);//关闭管道的读端
dup2(pipefd[1],1);//将标准输出重定向到管道的写端
execlp("ls","ls","-l",NULL);//执行ls -l
}
if(i == 1){//弟进程
close(pipefd[1]);//关闭管道的读端
dup2(pipefd[0],0);//将标准输入重定向到管道的读端
execlp("wc","wc","-l",NULL);
}
if(i == 2){
close(pipefd[0]);
close(pipefd[1]);
int w1,w2;
w1 = wait(NULL);//回收线程
w2 = wait(NULL);//回收线程
printf("%d\n",w1);
printf("%d\n",w2);
}
return 0;
}