ps -ef | grep pipe
ps -ef:将所有进程信息写入到标准输出
grep pipe:不断循环从标准输入读取数据进行字符串匹配过滤
shell进程中创建两个进程,一个进程运行ps,一个进程运行grep
要将ps进程的数据,交给grep进程只能通过进程间通信完成—匿名管道
流程:
- 创建管道
- 创建两个进程(不同进程,程序中体现为2个子进程,子进程通过父进程获得句柄),在各自进程中进行程序替换
- 在程序替换之前,ps进程应该标准输出重定向到管道写入端,grep进程应该标准输入重定向到管道读取端
- 父进程等待子进程退出
#include<stdio.h> //printf
#include<unistd.h> //fork
#include<stdlib.h> //exit
#include<sys/wait.h> //wait
int main(int argc,char* argv[]) //程序运行参数个数 程序运行字符串首地址
{
//1.创建管道
//2.创建两个进程,在各自进程进行程序替换
//3.在程序替换之前,ps进程应该标准输出重定向到管道写入端,grep进程应该标准输入重
定向到管道读端
//4.父进程等待子进程退出
//1.创建管道
int pipefd[2]; //创建读写接口
int ret=pipe(pipefd); //创建管道
if(ret<0){
perror("pipe error\n");
return -1;
}
//2.创建进程
if(fork()==0){ //子进程
dup2(pipefd[1],1); //重定向,标准输入写到写端
execlp("ps","ps","-ef",NULL); //函数替换 execlp("文件名","首字符","第二个参
数",NULL);
exit(-1); //退出子进程
}
if(fork()==0){ //子进程
close(pipefd[1]); //关闭所有写端,管道读取完毕,返回0,这样grep才可以读取到终
端数据
dup2(pipefd[0],0); //标准输入重定向到读端
execlp("grep","grep","pipe",NULL);
exit(-1);
}
//4.父进程等待子进程退出
close(pipefd[0]); //关闭父进程读端
close(pipefd[1]); //关闭父进程写端
wait(NULL); //子进程写端等待
wait(NULL); //子进程读端等待
return 0;
}