13 .4进程之间的通讯方式 ~ 之 管道:pipe调用

popen是高级的函数,底层的使用pipe函数。
pipe这个函数在两个程序之间传递数据不需要启动一个shell来解释请求的命令。它同时提供了对读写数据的更多控制。
头文件: unstd.h
int pipe(int file_descriptor[2]);


Paste_Image.png

pipe 函数的参数是一个由两个整数类型的文件描述符组成的数组的指针。该函数在数组中填上两个新的文件描述符返回0,如果失败就会返回-1并设置errno来表明失败的原因。
linux手册上定义的一些错误:
(1)EMFILE: 进程使用的文件描述符过多
(2)ENFILE: 系统的文件表已经满
(3)EFAULT: 文件描述符无效
两个返回的问阿金描述符以一种特殊的方式连接起来。写到file_descriptor[1] 的所有数据都可以从file_descriptor[0]读回来。数据基于先进先出的原则(FIFO)进行处理,这意味着如果你把字节1,2,3写到file_descriptor[1],从file_descripter[0]读取到的数据也会是1,2,3.这个和栈有点不一样,栈是后进先出[LIFO];这个应该算是队列。

特别要注意:这里使用的是文件描述符而不是文件流,所以我们必须用底层的read和write调用阿里访问数据,而不是用文件流库函数fread 和fwrite。
PS:底层的有底层的方法,底层不可能直接通过流来处理,而是通过文件描述符。


管道写入和读取代码程序

这个程序用数组file_pipes[]中的两个文件描述符创建了一个管道。然后它用文件描述符file_pipes[1]向管道写数据,在从file_pipes[0]读取数据。注意,管道有一些内置的缓存区,它在write和read调用之间保存数据。
如果你尝试用file_descriptor[0]写数据或用file_descriptor[1]读数据,其后果未在文档中明确定义,所以其行为可能会非常奇怪,并且随着系统的不同,其行为可能发生变化。在我的系统上,这样的调用将失败并且返回-1,这至少能够说明这种错误比较容易发现的。
咋一看:管道没有什么特别,可以用一个简单的文件完成;

管道真正的优势在于:当你两个进程之间传递数据的时候。

(12章)当程序用fork调用创建新进程时候,原先打开的文件描述符忍将保持打开状态。如果在原先的进程中创建一个管道。然后在调用fork创建新继承,我们即可通过管道在两个进程之间传递数据。

进程之间传递数据,跨fork调用的管道

实验解析:
这个程序首先用pipe调用创建一个管道,接着用fork调用创建一个新进程。如果fork调用成功,父进程就写数据到管道中,而子进程从管道中读取数据。父进程都在只调用了一次write 或read之后就会退出。如果父进程在子进程之前退出,就会在两部分输出之间看到shell提示符(shell上运行)。
表面上:这个程序和上面的程序例子很相似,但是实际上这个例子中我们往前跨除了一大步,我们可以在不同的进程之间进行了读写操作了。


进程之间进行读写传递数据原理图

PS: pipe 的作用:

(1)一个是和文件写入和读取有点类似
(2)重点:可以在有亲缘关系的进程之间传递数据。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容