Linux学习笔记24——进程管道

一 管道的作用

  通常把一个进程的输出通过管道连接到另一个进程的输入。

二 popen和pclose函数

#include <stdio.h>FILE *popen(const char *command,      //是要运行的程序名和相应的参数
       const
char *open_mode      //必须是“r”或者“w”,如果是其它值,errno将返回EINVAL
       );                 
int pclose(FILE *stream_to_close);     

  popen() 函数通过创建一个管道,调用 fork 产生一个子进程,执行一个 shell 以运行命令来开启一个进程。

  pclose()调用只在popen启动的进程结束后才返回,如果调用pclose函数时它仍在运行,pclose调用将等待该进程的结束。

例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>int main(){FILE *read_fp;          //要读取的文件描述符char buffer[BUFSIZ+1];      //用来存储读到的文件信息int chars_read;          //实际读取的元素个数memset(buffer,'\0',sizeof(buffer));    //将数组清零初始化read_fp=popen("cat test*.c | wc -l","r");  //创建管道,用于显示所有test*.c文件的字数if(read_fp!=NULL){chars_read=fread(buffer,sizeof(char),BUFSIZ,read_fp);//从一个文件流中读数据,最多读取count个元素,每个元素size字节,如果调用成功返回实际读取到的元素个数,如果不成功返回 0while(chars_read>0){buffer[chars_read-1]='\0';      //清除回车符printf("Reading:-\n %s\n",buffer);chars_read=fread(buffer,sizeof(char),BUFSIZ,read_fp);}pclose(read_fp);        //关闭管道exit(EXIT_SUCCESS);}exit(EXIT_FAILURE);
}

  使用shell的一个不太好的影响:针对每个popen调用,不仅要启动一个被请求的程序,还要启动一个shell,即每个popen调用将多启动两个进程。从节省系统资源的角度来看,popen函数的调用成本略高,而且对目标命令的调用比正常方式要慢一些。

三 pipe函数

#include <unistd.h>
int pipe(int fd[2]);

  pipe函数的参数是一个由两个整数类型的文件描述符组成的数组的指针,两个返回的文件描述符以一种特殊的方式连接起来,写到fd[1]的所有数据都可以从fd[0]读回来,数据基于先进先出的原则(FIFO)进程处理。

  对一个已关闭写数据的管道做read调用将返回0而不是阻塞,读取无效的文件描述符将看作是一个错误并返回-1
 
  如果跨越fork调用使用管道,就会有两个不同的文件描述符可以用于向管道写数据,一个在父进程中,一个在子进程中。只有把父子进程中的针对管道的写文件描述符都关闭,管道才会被认为是关闭了,对管道的read调用才会失败。

管道的读写规则:

  1 从管道中读取数据

  • 如果管道的写端不存在,则认为已经读到了数据的末尾,读函数返回的读出字节数为0;
  • 当管道的写端存在时,如果请求的字节数目大于PIPE_BUF,则返回管道中现有的数据字节数,如果请求的字节数目不大于 PIPE_BUF,则返回管道中现有数据字节数(此时,管道中数据量小于请求的数据量);或者返回请求的字节数(此时,管道中数据量不小于请求的数据 量)。注:(PIPE_BUF在include/linux/limits.h中定义,不同的内核版本可能会有所不同。Posix.1要求 PIPE_BUF至少为512字节,red hat 7.2中为4096)。

  2 从管道中写入数据

  向管道中写入数据时,linux将不保证写入的原子性,管道缓冲区一有空闲区域,写进程就会试图向管道写入数据。如果读进程不读走管道缓冲区中的数据,那么写操作将一直阻塞。
  注:只有在管道的读端存在时,向管道中写入数据才有意义。否则,向管道中写入数据的进程将收到内核传来的SIFPIPE信号,应用程序可以处理该信号,也可以忽略(默认动作则是应用程序终止)。

 

例子:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>int main(){const char some_data[]="123";int file_pipes[2];int data_processed;pid_t fork_result;if(pipe(file_pipes)==0){fork_result=fork();if(fork_result==(pid_t)-1){fprintf(stderr,"Fork failure");exit(EXIT_FAILURE);}if(fork_result==0){      //子进程close(0);          //关闭标准输入,即键盘输入dup(file_pipes[0]);    //复制一个文件描述符close(file_pipes[0]);    //关闭读操作close(file_pipes[1]);   //关闭写操作execlp("od","od","-c",(char*)0);  //利用od查看特殊格式的文件内容,-c表示ASCII字符或反斜杠序列,(char*)0参数作用是终止被调用程序的参数列表exit(EXIT_FAILURE);}else{     //主进程close(file_pipes[0]);  data_processed=write(file_pipes[1],some_data,strlen(some_data));  //写入数据close(file_pipes[1]);printf("%d - wrote %d bytes\n",getpid(),data_processed);}}exit(EXIT_SUCCESS);
}

 

 

 

  

转载于:https://www.cnblogs.com/zjzsky/p/3518604.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/386280.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

耗时两个礼拜,8000字安卓面试长文,建议收藏

本专栏专注分享大型Bat面试知识&#xff0c;后续会持续更新&#xff0c;喜欢的话麻烦点击一个关注 面试官: ButterKnife为什么执行效率为什么比其他注入框架高&#xff1f;它的原理是什么 心理分析&#xff1a; ButterKnife框架一直都是使用&#xff0c;很少又开发者对butterkn…

VS2010常用快捷键

1、自动排版 编辑.格式化选定内容 Ctrl K&#xff0c;Ctrl F(form)根据周围的代码行&#xff0c;正确缩进选定的代码行。 2、注释与去掉注释功能。 编辑.注释选定内容 Ctrl K&#xff0c;Ctrl C(comment) 使用编程语言的正确注释语法将代码的当前行标记为注释。 编辑.取消注…

腾讯+字节+阿里面经真题汇总,Android篇

简介 首先&#xff0c;Android是不是真的找工作越来越难呢&#xff1f;这个可能是大家最关心的。这个受大的经济环境以及行业发展前景的影响&#xff0c;同时也和个人因素有关。 近期一方面是所在的公司招聘Java开发人员很难招到合适的&#xff0c;投简历的人很少&#xff1b;…

border-image图片边框

一、border-image的兼容性 1、支持到IE11以上&#xff0c;其他主要浏览器均支持 2、使用webkit以后支持android4.3以上 二、border-image的参数&#xff08;包括图片、裁剪位置、重复性&#xff09; 1、图片&#xff08;border-image-source&#xff09;采用url&#xff08;&am…

腾讯3轮面试都问了Android事件分发,原理+实战+视频+源码

一、架构师专题 想要掌握复杂的技术&#xff0c;必须要理解其原理和架构。本模块结合实际一线互联网大型项目理解架构思维&#xff0c;抽丝剥茧&#xff0c;层层深入&#xff0c;帮助大家成为Android架构师&#xff0c;在思想上对架构认识有一次升华&#xff0c;并知其所以然&a…

Java自学笔记(16):常用类:Math,Data和Calender,Format,Scanner

Math类 位于java.lang包&#xff0c;主要用于基本的算术运算&#xff0c;包含的成员都是静态的&#xff0c;可以直接调用 两个常量&#xff1a;PI&#xff0c;E 方法&#xff1a; sin(double a) 返回角的三角正弦。 cos(double a) 返回角的三角余弦。 tan(double a) 返回角的三…

熬夜肝完这份Framework笔记,已拿到offer

第一次观看我文章的朋友&#xff0c;可以关注、点赞、转发一下&#xff0c;每天分享各种干货技术和程序猿趣事 前言 随着移动终端的快速发展&#xff0c;Android开发人员也越来越多&#xff0c;Android开发市场也进入了一个饱和的状态&#xff0c;Android开发人员也面临着难找…

[LoadRunner]UTF8字符格式

前一编说到xmlrpc调用操作&#xff0c;由于有时候在xmlrpc里有中文字符的请求&#xff0c;但由于上传的请求与服务器的编码不匹配&#xff0c;会导致请求不成功。 那么我们就需要把服务端的编码与客户端的编码统一&#xff0c;这里说一下uft8中文字符转换 int XmlBody() {char …

现在做Android开发有前途吗?复习指南

背景 知乎客户端中有一个自己维护的 Hybrid 框架&#xff0c;在此基础上开发了一些 Hybrid 页面&#xff0c;当需要前端或者客户端开发接口的时候&#xff0c;就涉及到联调的问题。 和一般的 前端 <> 服务端&#xff0c;或者 客户端 <> 服务端 类似&#xff0c;前…

TreeSet

/*Set : 无序&#xff0c;不可以重复元素|--HashSet:数据结构是哈希表&#xff0c;线程是非同步的保证元素唯一性原理&#xff1a; 判断元素的HashCode值是否相同如果相同&#xff0c;还会继续判断元素的equals方法是否为True|TreeSet: 可以对集合中的元素进行排序底层数据结构…

现在做Android开发有前途吗?社招面试心得

开头 面试时间&#xff1a;2021.2.9 1~3面、2021.2.13 4~6面、2021.2.26 HR面 面试部门 岗位&#xff1a;商业化 - 高级 Android 开发工程师 面试感想&#xff1a;整体面得比较累&#xff0c;基础面、交叉面、Boss面&#xff0c;前前后后对接了 6 个面试官 (离当初给我说的 3面…

现在做Android开发有前途吗?附面试题答案

开头 笼统来说&#xff0c;中年程序员容易被淘汰的原因其实不外乎三点。 1、输出能力已到顶点。这个人奋斗十来年了&#xff0c;依旧碌碌无为&#xff0c;很明显这人的天花板就这样了&#xff0c;说白了&#xff0c;天赋就这样。 2、适应能力越来越差。年纪大&#xff0c;有家…

C++开发WPF,Step by Step

C开发WPF&#xff0c;Step by Step 示例代码 使用C来开发WPF&#xff0c;主要是如何在MFC&#xff08;Win32&#xff09;的窗口中Host WPF的Page。下面我就做个详细的介绍. 一、创建工程, 由于MFC的Wizard会生成很多用不到的代码&#xff0c;所以我准备从一个空的工程开始创建一…

C#学习之unsafe

为了保持类型安 全&#xff0c;默认情况下&#xff0c;C# 不支持指针算法。 不过&#xff0c;通过使用 unsafe 关键字&#xff0c;可以定义可使用指针的不安全上下文。 unsafe 在C# 程 序中的使用场合&#xff1a; 1&#xff09;实时应用&#xff0c;采用指针来提高性能&…

百度、华为、京东、B站最新面试题汇集,实战篇

前言 回顾一下自己这段时间的经历&#xff0c;因公司突然通知裁员&#xff0c;我匆匆忙忙地出去面了几家&#xff0c;但最终都没有拿到offer&#xff0c;我感觉今年的寒冬有点冷。公司开始第二波裁员&#xff0c;我决定主动拿赔偿走人。后续的面试过程我做了一些准备&#xff…

php 常用正则运算

$regx "/^[0-9]*$/"; var_dump(preg_match($regx, $phone));常用的正则运算&#xff1a; •验证数字&#xff1a;^[0-9]*$ •验证n位的数字&#xff1a;^\d{n}$ •验证至少n位数字&#xff1a;^\d{n,}$ •验证m-n位的数字&#xff1a;^\d{m,n}$ •验证零和非零开头的…

百度、阿里、滴滴、新浪的面试心经总结,一线互联网公司面经总结

开头 技术的发展产生了程序员这个职位&#xff0c;从这些年各大互联网公司曝光的一些员工收入水平来看&#xff0c;程序员的工资还是相对比较高的&#xff0c;可是我们在互联网上还听到了另外一种声音&#xff0c;很多程序员想转行&#xff0c;特别是大龄程序员&#xff0c;这…

go build编译不同环境

#usage: go build [-o output] [-i] [build flags] [packages] go build的使用比较简洁&#xff0c;所有的参数都可以忽略&#xff0c;直到只有go build&#xff0c;这个时候意味着使用当前目录进行编译&#xff0c;下面的几条命令是等价的&#xff1a; go buildgo build .go b…

百度、阿里、滴滴、新浪的面试心经总结,源码+原理+手写框架

前言 作为一个程序员&#xff0c;如果你在新知识、新技术面前仍一无所知&#xff0c;依然吃着十多年前的老本&#xff0c;那你在知识技术上肯定落伍&#xff0c;如果又未能进入管理层面&#xff0c;那你肯定就会被长江的后浪拍在沙滩上了。 而不少与时俱进、善于学习的程序员…

LINQ to SQL

Moved to http://blog.tangcs.com/2008/10/06/linq-to-sql/转载于:https://www.cnblogs.com/WarrenTang/archive/2008/10/06/1304727.html