什么是进程间通信

        Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)。

什么是管道

        管道是一种最基本的IPC机制,也称匿名管道,应用于有血缘关系的进程之间,完成数据传递。调用pipe函数即可创建一个管道。

管道有以下特性:

  • 管道的本质是一块内核缓冲区
  • 由两个文件描述符引用,一个表示读端,一个表示写端。
  • 规定数据从管道的写端流入管道,从读端流出。
  • 当两个进程都终结的时候,管道也自动消失。
  • 管道的读端和写端默认都是阻塞的。

管道创建步骤:

  • 父进程调用pipe函数创建管道,得到两个文件描述符fd[0]和fd[1],分别指向管道的读端和写端。
  • 父进程调用fork创建子进程,那么子进程也有两个文件描述符指向同一管。
  • 父进程关闭管道读端,子进程关闭管道写端。父进程可以向管道中写入数据,子进程将管道中的数据读出,这样就实现了父子进程间通信。

相应代码如下:

#include<iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
using namespace std;int main()
{//创建管道//int pipe(int pipefd[2]);int fd[2];int ret = pipe(fd);if(ret<0){perror("pipe error");return -1;}//创建子进程pid_t pid = fork();if(pid<0) {perror("fork error");return -1;}else if(pid>0){//关闭读端close(fd[0]);sleep(5);write(fd[1], "hello world", strlen("hello world"));  wait(NULL);//保证父进程阻塞,子进程先退出}else {//关闭写端close(fd[1]);char buf[64];memset(buf, 0x00, sizeof(buf));int n = read(fd[0], buf, sizeof(buf));cout << "read over, n=" << n << " buf=" << buf << endl;}return 0;
}

结果如下:

子进程读到了父进程发送的数据!!!

完结!!!!

使用管道完成父子进程间通信相关推荐

  1. Linux:进程间通信(创建匿名管道,父子进程间通信,兄弟进程间通信)

    过一遍管道的基础知识: 1.本质:存在于高速缓存区,属于伪文件,不占用磁盘空间.缓冲区大小默认4K,可根据实际情况适当调整 2.读端和写端各自对应一个文件描述符,数据从写端流入,读端流出 3.操作管道 ...

  2. c语言父子进程,C语言无名管道实现父子进程间通信

    /** *父子进程中管道通信 * */ #include #include #include #include #include #include #define SIZE 128//缓存区大小 ch ...

  3. 开发日记-20190823 linux有名管道fifo,进程间通信

    转载于和感谢:linux有名管道fifo,进程间通信 命名管道(FIFO)不同于无名管道之处在于它提供了一个路径名与之关联,以 FIFO 的文件形式存在于文件系统中,这样,即使与 FIFO 的创建进程 ...

  4. Linux系统编程---5(共享存储映射,存储映射I/O,mmap函数,父子进程间通信,匿名映射)

    共享存储映射 文件进程间通信 使用文件也可以完成 IPC,理论依据是,fork 后,父子进程共享文件描述符.也就共享打开的文件. 编程:父子进程共享打开的文件.借助文件进行进程间通信. 测试代码 /* ...

  5. mmap父子进程间通信

    父子等有血缘关系的进程之间也可以通过mmap建立的映射区来完成数据通信.但相应的要在创建映射区的时候指定对应的标志位参数flags:MAP_PRIVATE:(私有映射)父子进程各自独占映射区:MAP_ ...

  6. 管道实现父子进程的信息传递(二)【标准流和其文件描述符、fwrite函数、perror函数】

    文章目录 代码实现 标准流 和 标准流文件描述符 代码中用到的函数 fwrite() perror() 在复习进程间的通信方式时又写了一遍,和 管道实现父子进程的信息传递(一)[fork函数.pipe ...

  7. 管道实现父子进程的信息传递(一)【fork函数、pipe函数、write/read操作、wait函数】

    文章目录 题目描述 代码实现 关于pipe函数 关于读写操作 关于读写端口 关于wait函数 功能: 注意: 关于fork函数 题目描述 编写一个程序,利用管道实现父子进程的通信,父进程向子进程发送信 ...

  8. c语言程序实现进程的管道通信,C 进程间通信--命名管道通信代码实现及其原理图示...

    在将这个题目之前大家需要了解几个概念: 进程: 我们可以先看进程的定义:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础: ...

  9. linux程序间管道通信,linux进程间通信——管道 详解

    管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入.常说的管道多是指无名管道, 无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别. 有名管道叫nam ...

最新文章

  1. 获得C币规则(截止2017年10月已失效,万恶的CSDN)
  2. python核心编程:web服务器日志分析简单脚本
  3. 获取SQL SERVER某个数据库中所有存储过程的参数
  4. java 判断数字二进制有几位_判断一个二进制数字有多少个1----java实现
  5. DUMP文件分析4:栈溢出
  6. Linux 引入自动化测试平台 KernelC
  7. 3. 线性表的链式结构
  8. javascript 数组去重 unique
  9. 对象str()与reper()转换为字符串
  10. 利用express启一个server服务
  11. 初学python100例-案例10 python兔子生兔子 多种不同解法 青少年python编程 少儿编程案例讲解
  12. Hebb和Delta学习规则
  13. 宏碁Aspire 4560试用手记
  14. 姓舒男孩名字简单大气
  15. windows11设置chrome谷歌浏览器为默认浏览器
  16. 华师在线计算机网络,华师在线-作业计算机网络.docx
  17. php单页菜单,纯CSS3单页切换导航菜单界面设计
  18. 『每周译Go』Go sync map 的内部实现
  19. 咸鱼菌玩3D—样条曲线和贝塞尔曲线
  20. iStat Menus ——mac上显示网速的软件下载地址及注册码

热门文章

  1. 羽毛球前场击球技术与实战运用
  2. 时尚就是反潮流-论如何跟上技术前进的脚步
  3. 三星平台fimc驱动详解
  4. Win10下adb连接到华为Mate10 Pro手机
  5. 教你免费制作个人红包封面|这个年我们不抢红包了,抢红包皮
  6. 分布式智能微电网的建设方案与应用场景
  7. 自己整理的一些《深入理解Java虚拟机》的知识点
  8. 【安卓】安卓下 read-only file system mount: ‘/system‘ not in /proc/mounts
  9. 苹果手机软件升级密码_iPhone在线升级好?还是电脑上升级好?看完不再纠结
  10. 群晖docker位置_自己折腾群晖NAS用SSD硬盘减少噪音