您的位置:首页 > 运维架构 > Linux

Linux系统编程:pipe匿名管道的使用,实现linux命令下管道命令

2018-03-20 21:53 627 查看

pipe函数介绍

函数原型int pipe(int pipefd[2]) 来创建匿名管道; 传出2个fd 文件描述符,pipefd[0]表示匿名管道的读端,pipefd[1]表示匿名管道的写端。有这个管道后,我们就可以在有血缘关系的进行之间实现通信了

pipe的使用

我们在linux中使用 使用的 | 竖线可以通过管道来实现,也就是可以用C语言编程实现 ps aux | grep bash 之类的效果。我们通过这个函数来实现 ps aux | grep bash 的功能。原本 ps aux 是将程序返回的内容 写出到 终端上,grep 是从终端读取内容,现在我们要利用管道来实现这个功能,那么我们就要实现文件重定向,将原来往 终端上写 将其改为 往管道文件中写,原来从终端上读 改为从管道文件中读,所有这里要用的dup2 函数

代码实现

我们用2个子进程,一个子进程 负责 ps aux 的执行,一个负责 grep bash的执行,主进程 负责子进程资源的回收。#include <stdio.h>
#include <wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
//兄弟进程间通信 实现 ps aux | grep bash
int main(void)
{
int fd[2];
int res = pipe(fd);
if(res)
{
perror("pipe error");
exit(1);
}
int i;
pid_t pid;
for(i = 0;i<2;i++)
{
pid_t pid = fork();//创建子进程
if(pid==0)
{
break;//子进程 跳出
}
}
if(i==0)//子进程1 grep bash ,做为读端,原来是从终端读,现在从管道中读数据
{
close(fd[1]);//关闭写端
dup2(fd[0],STDIN_FILENO);
execlp("grep","grep","bash",NULL);
}else if(i==1)
{ //子进程2 执行 ps aux 作为写端,将结果写到管道中
close(fd[0]);//关闭读端
dup2(fd[1],STDOUT_FILENO);//ps aux 原来是往终端写,现在往 管道写
execlp("ps","ps","aux",NULL);
}else
{
//父进程不需要 读写 端口都要关闭
close(fd[0]);
close(fd[1]);
//父进程 回收子进程资源
int status;
pid_t wpid;
while((wpid=waitpid(-1,&status,WNOHANG))!=-1)
{
if(wpid>0)
{
if(WIFEXITED(status))
{
printf("进程%d 正常退出的状态%d\n",wpid, WEXITSTATUS(status));
}else if (WIFSIGNALED(status))
{
printf("进程%d 异常退出的状态%d\n",wpid, WTERMSIG(status));
}
}
}
}
return 0;
}

代码运行检查

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: