为什么80%的码农都做不了架构师?>>>   

管道是最初的IPC方式,经常会在shell命令中使用。

引用《UNIX网络编程》上例子:

我们在某个Unix shell中输入下面的命令:

who | sort | lp

这个shell包含三个命令,who命令的输出(通过管道)做为sort命令的输入,sort的输出做为lp命令的输入,最终显示lp命令的输出。

这里暂不关心每个命令的作用,只考虑管道是如何传递的。

shell会创建三个进程分别执行这三个命令,三个进程间通过管道进行数据传输。如下图所示:

接下来通过程序进行模拟,为方便起见,我们只考虑两个命令通过管道通信。

比如执行shell命令:命令1 | 命令2

命令1、命令2会由shell的两个子进程分别执行,两命令对应的两个进程不妨叫做大儿子、小儿子。

大儿子会对其弟弟问好,小儿子接收其哥哥的信息并打印到标准输出。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>/*主进程fork两个子进程,两子进程通过管道传递数据*/
int main()
{int fields[2];char buf[100];int pid1, pid2;// 创建一个管道if(pipe(fields) < 0 ){perror("创建管道失败!");}// 父进程创建第一个儿子if((pid1 = fork()) < 0){perror("创建子进程失败");}if(0 == pid1) // 大儿子{printf("大儿子有话对兄弟说: Hi,how are you?\r\n");char words[] = "Hi,how are you?";write(fields[1], words, sizeof(words));}if(pid1 > 0 ) // 父进程{// 父进程创建第二个儿子if((pid2 = fork()) < 0){perror("创建子进程失败");}if(0 == pid2) // 小儿子{printf("小儿子接收哥哥的信息:");read(fields[0], buf, sizeof(buf));printf("%s\r\n", buf);}if(pid2 > 0){waitpid(pid1, NULL, 0);waitpid(pid2, NULL, 0);}}return 0;
}

编译并执行:

$ gcc pipe.c

$ ./a.out

大儿子有话对兄弟说: Hi,how are you?

小儿子接收哥哥的信息:Hi,how are you?

2011-11-11 任洪彩 qdurenhongcai@163.com

转载请注明出处。

转载于:https://my.oschina.net/renhc/blog/35006

【IPC通信】匿名管道相关推荐

  1. Linux进程通信——匿名管道、命名管道、管道的特性和共享内存

    Linux进程通信--匿名管道.命名管道.管道的特性和共享内存 一.管道 1.1 什么是管道? 1.2 匿名管道 <1> 匿名管道参数说明 <2> fork共享管道原理 < ...

  2. linux学习---linux基于文件的IPC(匿名管道pipe,命名管道mkfifo,普通文件,socket文件)

    常用的IPC分为两个类别,一是基于文件,而是基于内存 基于文件的分别有匿名管道,有名管道,普通的文件共享,socket文件 基于内存的有普通内存共享(本文章没有介绍),共享内存,共享信号量,消息队列 ...

  3. 【编撰】linux IPC 002 - 匿名管道PIPE和有名管道FIFO的概念和实例,以及应用比较

    前言:上一节提到IPC的概述,本一节,原文作者比较详细的讨论了,管道的概念和实例和使用场景: 原文作者:郑彦兴 (mlinux@163.com)国防科大计算机学院 http://www.ibm.com ...

  4. Linux IPC:匿名管道 与 命名管道

    目录 一.管道的理解 二.匿名管道 三.命名管道 四.管道的通信流程 五.管道的特性   进程间通信方式有多种,本文介绍的是管道,管道分为匿名管道和命名管道. 一.管道的理解   生活中的管道用来传输 ...

  5. 匿名管道和命名管道(代码剖析)

    目录 一.进程间通信(IPC): 二.管道 来源于生活 三.匿名管道:在本地机器上可以实现父进程与子进程之间的通信 匿名管道的使用: 操作接口: 管道特性: 管道符代码实现: 命名管道(Named P ...

  6. Linux中父子进程、兄弟子进程之间通信方式--匿名管道pipe(适用于有血缘关系的进程)

    文章目录 编程环境: 进程间通信 IPC: 匿名管道(pipe): 父子进程间通信: 兄弟子进程间通信: 管道的读写行为: 读操作: 写操作: 查看管道缓冲区大小: 设置管道的非阻塞属性: 下载地址: ...

  7. 【Linux】进程间通信--管道(匿名管道和命名管道)

    文章目录 前言 进程间通信的目的 管道 匿名管道 管道特点 站在文件描述符角度理解管道 匿名管道通信读写特点 命名管道 命名管道的原理 命名管道的创建 命名管道完成两个不同进程通信 匿名管道和命名管道 ...

  8. 进程通信:匿名管道和命名管道

    一.进程间通信方式 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系. 有名管道 (named pipe) : ...

  9. C++学习:第六章Linux高级编程 - (七)信号、sigqueue、sigaction、IPC、管道、匿名管道

    回顾: 1. 信号的作用 2. 理解信号: 软中断 可靠与不可靠信号 kill -l 3. 信号发送与注册 kill/raise alarm setitimer signal 4. 信号的屏蔽 sig ...

  10. 8、进程通信-匿名管道

    匿名管道 一个单向,未命名的管道,通常用来在一个父进程和一个子进程间传输数据.只能实现本地机器上两个进程间的通信,而不能实现跨网络的通信. BOOL CreatePipe( PHANDLE hRead ...

最新文章

  1. Expo大作战(十八)--expo如何发布成独立应用程序,打包成apk或者ipa,发布到对应应用商店...
  2. 吴恩达:数据集的规模和学习机制都很重要!
  3. arcgis栅格计算器python教程_ArcGIS栅格计算器
  4. Androidi性能优化之多线程和同步
  5. LeetCode第 3 场双周赛(2019.6.29)第一题:小于 K 的两数之和
  6. 工业用微型计算机(25)-伪操作(1)
  7. shell 脚本编程之for语句、if语句(2 )
  8. IOS(常用移动终端设备) push实现通知中心
  9. 漫步凸分析六——凸集的相对内点
  10. python实验结论怎么写_Python实验课:Python元组数据及其运算
  11. java 内部类和静态内部类的区别
  12. [Swift]LeetCode145. 二叉树的后序遍历 | Binary Tree Postorder Traversal
  13. android启动序列帧动画,关于 Lottie 动画的说明及应用
  14. 西门子g120变频器接线图_西门子S7—1500第二十二讲(G120变频器第二篇)
  15. 50个MySql语句
  16. Linux部署k8s集群
  17. python提取时长2s以内的单词音频的韵母基频,以及单词词长信息
  18. 设计模式之策略+工厂实现支付功能代码优化
  19. Java中如何创建一个文件或者文件夹
  20. iPhone定义自己的个性手机铃声

热门文章

  1. 计算机二级文字处理解题步骤,计算机二级Msoffice~文字处理答案解析(解题步骤)...
  2. linux系统调用记录模块实验报告,华科操作系统实验报告(DOC)
  3. python随机列表文本_在python中从单词列表返回随机单词
  4. some any oracle,Oracle之 any、some、all 解析
  5. 用户不在sudoers文件中,此事将被报告
  6. 人月神话阅读笔记01
  7. 数据库设计(关系型)
  8. webservice第一篇【介绍、Scoket、http调用、wsimport调用】
  9. [Cocos2d-html5]关于压缩
  10. DICOMDIR结构