13.5 pipe ~ 父进程和子进程

学习如何在子进程中运行一个与其父进程完全不同的另外一个程序,而不是仅仅运行一个相同程序。我们使用exec调用来完成。

难点:通过exec调。用的进需要知道访问哪个文件描述符。

前面的例子中,因为子进程本身有file_pipes 数据的一份副本,所以这并不成为问题。经过了exec调用后,情况就会不一样了,因为原先的进程已经被新的子进程替换了。为了解决这个问题,我们可以将文件描述符(实际上只是一个数字)作为参数传递给用exec启动的程序。

为了演示它是如何工作的,我们需要两个程序。第一个程序是数据的产生者,它负责创建管道和启动子进程,后者是数据消费者。


pipe3的代码

pipe4的代码

上面的代码是为了实现pipe3调用pipe4的代码;但是结果并没有出现预期的那样;


Paste_Image.png

pipe3 程序的开始部分和前面的例子是一样的,用pipe调用创建一个管道,然后用fork调用创创建一个新进程。接下来,用sprintf把读取的管道数据的文件描述符存到一个缓存区中,该缓存区中的内容将构成pipe程序中的一个参数。
通过execl调用来启动pipe4程序,execl的参数如下所示。
(1)要启动的程序

(2)argv[0]: 程序名
(3)argv[1] : 包含我们想让被调用程序去读取的文件描述符
(4)(char*)0: 这个参数的作用是终止被调用程序的参数列表。
pipe4程序从参数字符中提取出文件描述符数字,然后读取该文件描述符来获取数据。

13.5.1 管道关闭后的读操作
以前:我们一般是采取的是让进程读取一些数据然后直接退出的方式,并假设Linux会把清理文件当作是在进程结束的时应该做的工作的一部分。
实际: 从标准输入的方法会很不同。通常不知道有多少数据,而采用循环方法: 读取收——处理数据—— 读取更多的文件的数据直到没有数据可读为止。
当没有数据可读的时候,read通常会阻塞。它将暂停进程来等待知道有数据到达为止。如果管道的另外一端已经被关闭(也就是说,没有进程打开这个管道并向它写数据了)这时候read调用就会阻塞。这就使读进程能够检测文件结束一样,对管道进程检测并作出相应的动作。
有数据就是读取,没有数据就会循环检查等动作,阻塞等待。
。。。 这与读取一个无效的文件描述符不同,read把无效的文案描述符看作一个错误并返回-1。
若是跨越fork调用使用管道,就会有父子两个进程向管道中写入数据。这个时候父子进程对管道的写文件描述符都关闭了,管道才会被认为是关闭了。对管道read调用才会失败。

13.5.2 把管道作为标准输入和标准输出####

下面是关于用管道来连接两个进程更加简洁的方法。我们把其他一个管道文件描述符设置为一个已知的值,一般是会标准输入0或标准输出1.在父进程中设置较为复杂,在子进程中设置比较简单。 头文件: unistd.h
int dup(in file_descriptor);
int dup2(int file_descriptor_one, int file_descriptor_two);
dup 调用的目的是打开一个新的文件描述符,与open有点类似。
不同之处是,dup调用创建的新文件描述符与作为它的参数的那个已有文件描述符指向了同一个文件(管道)。对于dup函数来说,新文件描述符总是取最小的可用值。对于dup2函数来说,它所创建的新文件描述符或者与参数file_descriptor_two相同,或者是第一个大于该参数的可用值。

可以使用通用的fcntl调用(cmmand参数设置为F_DUPFD)来达到与调用dup和dup2相同的效果。但是dup更加容易使用。

dup如何帮助我们在进程之间传递数据的呢?
因为标准输入的文件描述符总是0,而dup返回的新的文件描述符又总是0,而dup返回的新的文件描述符有总是小于可用的数字。因为,如果我们首先关闭文件描述符0然后调用dup,那么新的文件描述符就将是数字0.因为新的文件描述符是复制一个已有的文件描述符,所以,标准输入就会改为指向一个我们传递给dup函数的文件描述符所对应的文件或管道。我们创建了两个文件描述符,他们指向了一个文件或管道,而且其中之一是标准输入。

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

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,930评论 6 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • 我记事时,我家是住大路边上,前后三间瓦房,中间是一个大院子,两边是土筑的院墙。 从前屋到后屋是露天走廊,前屋地势低...
    虹树阅读 705评论 35 27
  • 相信Shared Preferences对所有开发者都不陌生了,接下来给大家分享一下我对它的理解和封装 当然你在用...
    Dirain阅读 361评论 0 1