由于该指令是通过管道的形式实现的,所以我们要使用系统函数pipe。ls -l |wc -l的作用就是统计当前目录有多少文件。如果又父进程实现ls -l,子进程实现wc -l指令,代码如下:
#include<unistd.h>
#include<stdio.h>
#include<string.h>
#include<sys/wait.h>
int main()
{
int pipefd[2]={0};
if(pipe(pipefd)==-1)perror("创建管道失败");
int pid=fork();
if(pid==0)
{
close(pipefd[1]);
dup2(pipefd[0],STDIN_FILENO);//将wc指令的输入文件描述符重定向为管道的读入端文件描述符
execlp("wc","wc","-l",NULL);
close(pipefd[0]);
}
else if(pid>0)
{
close(pipefd[0]);//将读端关闭
dup2(pipefd[1],STDOUT_FILENO);//将标准输入的文件描述符重定向为管道的写入端文件描述符
execlp("ls","ls","-l",NULL);
close(pipefd[1]);
}
else
{
perror("创建进程失败");
}
return 0;
}
由于父子间通过管道实现,所以存在读写阻塞问题,不用担心僵尸进程的产生,所以可以不用调用wait函数回收子进程。
运行结果如下:
如果是兄弟进程实现上面的程序,代码如下
#include<unistd.h>
#include<stdio.h>
#include<string.h>
#include<sys/wait.h>
int main()
{
int pipefd[2]={0};
if(pipe(pipefd)==-1)perror("创建管道失败");
int pid;
int i=0;
for(;i<2;i++)
{
if((pid=fork())==0)break;
}
if(i==0)
{
close(pipefd[1]);
dup2(pipefd[0],STDIN_FILENO);//将wc指令的输入文件描述符重定向为管道的读入端文件描述符
execlp("wc","wc","-l",NULL);
close(pipefd[0]);
}
else if(i==1)
{
close(pipefd[0]);//将读端关闭
dup2(pipefd[1],STDOUT_FILENO);//将标准输入的文件描述符重定向为管道的写入端文件描述符
execlp("ls","ls","-l",NULL);
close(pipefd[1]);
}
else
{
close(pipefd[0]);
close(pipefd[1]);
//关闭父进程的读写端,保证兄弟进程间进行数据传输时,管道数据单向流通
for(int i=0;i<2;i++)
{
wait(NULL);
}
}
return 0;
}
运行结果一样: