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;
}

代码运行检查

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

  1. linux系统编程快速定位头文件的技巧之强大的grep命令

    这个技巧来自于我的实际开发碰到的: inet_addr这个函数用于把ip地址转成网络字节序,他的原型:in_addr_t inet_addr(const char *cp); 返回值为一个in_add ...

  2. linux系统编程需要什么,若想成为一名Linux下编程高手,必须能对各种系统调用有透彻的了解...

    原标题:若想成为一名Linux下编程高手,必须能对各种系统调用有透彻的了解 什么是系统调用? Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用.用户可以通过系统调用命令在自己的应用 ...

  3. linux系统编程界面实验报告,操作系统实验报告-Linux操作使用编程.doc

    操作系统实验报告-Linux操作使用编程 实 验 报 告( 2012/ 2013 学年 第二学期) 课程名称操 作 系 统A实验名称Linux操作.使用.编程实验时间2013年 5 月 6日指导单位计 ...

  4. Linux系统编程35:多线程之如何理解Linux中的线程以及轻量级进程LWP

    文章目录 (1)由"进程"到进程 (2)进程,线程和轻量级进程 A:进程和线程的关系 B:Linux中没有真正意义上的线程 C:轻量级进程-LWP (3)线程的优缺点 A:优点 B ...

  5. Linux系统编程24:基础IO之在Linux下深刻理解C语言中的动静态库以及头文件和库的关系

    文章目录 七:动态库和静态库 (1)什么是库 (2)静态库和动态库初步认识 A:静态库 B:动态库 C:头文件和库文件的关系 七:动态库和静态库 (1)什么是库 库就是现有的,已经写好的可复用的代码. ...

  6. Linux系统编程19:基础IO之了解Linux中的标准输入和输出以及相关的系统调用接口(如write,read等)

    文章目录 一:标准输入,标准输出和标准错误 (1)回忆C语言写文件 (2)stdin,stdout和stderr 二:读写文件新的系统调用接口 注意:库函数和系统调用接口的关系 (1):open基本情 ...

  7. Linux系统编程5:入门篇之在Linux下观察C/C++程序编译过程 gcc/g++使用详解

    文章目录 (1)gcc/g++完成编译的过程 A:预处理 B:编译 C:汇编 D:链接 (2)gcc/g++选项 (3)重要概念:函数库 A:gcc/g++在哪实现了函数 B:静态库与动态库 (1)g ...

  8. 【README】Linux系统编程必读:本专栏内容提要以及系统调用接口总结

    文章目录 前言 第一部分:博客知识点 (1)基础篇 Linux系统编程1:Linux中使用率最高的一些命令 Linux系统编程2:详解Linux中的权限问题 Linux系统编程3:基础篇之详解Linu ...

  9. 嵌入式Linux文件提取,嵌入式 Linux系统编程(四)——文件属性

    嵌入式 Linux系统编程(四)--文件属性 一.文件属性概述 Linux 文件的属性主要包括:文件的节点.种类.权限模式.链接数量.所归属的用户和用户组.最近访问或修改的时间等内容.文件属性示例如下 ...

  10. 【Linux】一步一步学Linux系统编程教程汇总(暂时暂停更新......)

    00. 目录 文章目录 00. 目录 01. 概述和标准 02. 文件操作 03. 进程概念 04. 进程间通信 05. 多线程 06. 信号 07. 同步与互斥 08. 高级IO 09. 其它 10 ...

最新文章

  1. c++重载(以运算符重载为主)
  2. 【Smart_Point】C/C++ 中共享指针 shared_ptr
  3. Spring MVC:带有CNVR卷的REST应用程序。 3
  4. java 对象查找_通过Java中的参数集查找最合适的对象
  5. make *** 没有指明目标并且找不到 makefile。 停止。_“关系红利”时代《请停止无效社交》,关键朋友是你的价值选择...
  6. SpingMVC之拦截器
  7. 火山视频抖音版批量下载,一个脚本就够了,手把手教你批量下载抖音火山高清视频。
  8. 军事指挥系统时间同步解决方案
  9. c语言strtok用法详细解释
  10. 去除文件系统、只读等属性
  11. 6.process.nextTick()
  12. Quartz - Java 任务调度
  13. CV-2022:CodeFormer【最强的AI 视频、图片修复】【南洋理工大学 S-Lab】
  14. Google Earth Engine (GEE)——awesome-gee-community-catalog
  15. 只用一张图,就能让二次元老婆动起来,宛如3D:这全是为了科学啊
  16. Windows Azure微软免费云空间成功申请和使用教程:安装WP博客
  17. 利用QEMU+GDB搭建Linux内核调试环境
  18. Sony 宣布为 Xperia M 发放 Android 4.3 Jelly Bean 固件更新
  19. 两板之间的ESP32客户端-服务器Wi-Fi通信(兼容ESP8266)
  20. 连更3课:MAX7219点阵屏、MAX7219点阵屏级联、TM1637数码管 | Mixly米思齐纯干货系列...

热门文章

  1. PS图片无损放大插件 Alien Skin Blow Up 3 for Mac
  2. CleanMyMac优化教程,使用CleanMyMac延长Mac的使用寿命
  3. FSNotes for Mac(强大的文本编辑器)
  4. java面试 泛型_Java面试题五:Java 的泛型, super T 和 extends T 的区别
  5. ht1621b和单片机电平匹配_有备无患,单片机面试问题集
  6. NOI数据结构:主席树
  7. html新增伪类,css3新增伪类有哪些
  8. 基于java 企业进销存管理系统设计(含源文件)
  9. Qt文档阅读笔记-QML Canvas的官方解析及实例
  10. SQL基础E-R图画法(一)