Linux系统编程:pipe匿名管道的使用,实现linux命令下管道命令
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命令下管道命令相关推荐
- linux系统编程快速定位头文件的技巧之强大的grep命令
这个技巧来自于我的实际开发碰到的: inet_addr这个函数用于把ip地址转成网络字节序,他的原型:in_addr_t inet_addr(const char *cp); 返回值为一个in_add ...
- linux系统编程需要什么,若想成为一名Linux下编程高手,必须能对各种系统调用有透彻的了解...
原标题:若想成为一名Linux下编程高手,必须能对各种系统调用有透彻的了解 什么是系统调用? Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用.用户可以通过系统调用命令在自己的应用 ...
- linux系统编程界面实验报告,操作系统实验报告-Linux操作使用编程.doc
操作系统实验报告-Linux操作使用编程 实 验 报 告( 2012/ 2013 学年 第二学期) 课程名称操 作 系 统A实验名称Linux操作.使用.编程实验时间2013年 5 月 6日指导单位计 ...
- Linux系统编程35:多线程之如何理解Linux中的线程以及轻量级进程LWP
文章目录 (1)由"进程"到进程 (2)进程,线程和轻量级进程 A:进程和线程的关系 B:Linux中没有真正意义上的线程 C:轻量级进程-LWP (3)线程的优缺点 A:优点 B ...
- Linux系统编程24:基础IO之在Linux下深刻理解C语言中的动静态库以及头文件和库的关系
文章目录 七:动态库和静态库 (1)什么是库 (2)静态库和动态库初步认识 A:静态库 B:动态库 C:头文件和库文件的关系 七:动态库和静态库 (1)什么是库 库就是现有的,已经写好的可复用的代码. ...
- Linux系统编程19:基础IO之了解Linux中的标准输入和输出以及相关的系统调用接口(如write,read等)
文章目录 一:标准输入,标准输出和标准错误 (1)回忆C语言写文件 (2)stdin,stdout和stderr 二:读写文件新的系统调用接口 注意:库函数和系统调用接口的关系 (1):open基本情 ...
- Linux系统编程5:入门篇之在Linux下观察C/C++程序编译过程 gcc/g++使用详解
文章目录 (1)gcc/g++完成编译的过程 A:预处理 B:编译 C:汇编 D:链接 (2)gcc/g++选项 (3)重要概念:函数库 A:gcc/g++在哪实现了函数 B:静态库与动态库 (1)g ...
- 【README】Linux系统编程必读:本专栏内容提要以及系统调用接口总结
文章目录 前言 第一部分:博客知识点 (1)基础篇 Linux系统编程1:Linux中使用率最高的一些命令 Linux系统编程2:详解Linux中的权限问题 Linux系统编程3:基础篇之详解Linu ...
- 嵌入式Linux文件提取,嵌入式 Linux系统编程(四)——文件属性
嵌入式 Linux系统编程(四)--文件属性 一.文件属性概述 Linux 文件的属性主要包括:文件的节点.种类.权限模式.链接数量.所归属的用户和用户组.最近访问或修改的时间等内容.文件属性示例如下 ...
- 【Linux】一步一步学Linux系统编程教程汇总(暂时暂停更新......)
00. 目录 文章目录 00. 目录 01. 概述和标准 02. 文件操作 03. 进程概念 04. 进程间通信 05. 多线程 06. 信号 07. 同步与互斥 08. 高级IO 09. 其它 10 ...
最新文章
- c++重载(以运算符重载为主)
- 【Smart_Point】C/C++ 中共享指针 shared_ptr
- Spring MVC:带有CNVR卷的REST应用程序。 3
- java 对象查找_通过Java中的参数集查找最合适的对象
- make *** 没有指明目标并且找不到 makefile。 停止。_“关系红利”时代《请停止无效社交》,关键朋友是你的价值选择...
- SpingMVC之拦截器
- 火山视频抖音版批量下载,一个脚本就够了,手把手教你批量下载抖音火山高清视频。
- 军事指挥系统时间同步解决方案
- c语言strtok用法详细解释
- 去除文件系统、只读等属性
- 6.process.nextTick()
- Quartz - Java 任务调度
- CV-2022:CodeFormer【最强的AI 视频、图片修复】【南洋理工大学 S-Lab】
- Google Earth Engine (GEE)——awesome-gee-community-catalog
- 只用一张图,就能让二次元老婆动起来,宛如3D:这全是为了科学啊
- Windows Azure微软免费云空间成功申请和使用教程:安装WP博客
- 利用QEMU+GDB搭建Linux内核调试环境
- Sony 宣布为 Xperia M 发放 Android 4.3 Jelly Bean 固件更新
- 两板之间的ESP32客户端-服务器Wi-Fi通信(兼容ESP8266)
- 连更3课:MAX7219点阵屏、MAX7219点阵屏级联、TM1637数码管 | Mixly米思齐纯干货系列...
热门文章
- PS图片无损放大插件 Alien Skin Blow Up 3 for Mac
- CleanMyMac优化教程,使用CleanMyMac延长Mac的使用寿命
- FSNotes for Mac(强大的文本编辑器)
- java面试 泛型_Java面试题五:Java 的泛型, super T 和 extends T 的区别
- ht1621b和单片机电平匹配_有备无患,单片机面试问题集
- NOI数据结构:主席树
- html新增伪类,css3新增伪类有哪些
- 基于java 企业进销存管理系统设计(含源文件)
- Qt文档阅读笔记-QML Canvas的官方解析及实例
- SQL基础E-R图画法(一)