Linux多进程间通信——管道通信实现

之前分享了linux多进程间通信的两种方法,套接字和共享内存通信。今天来分享一下另外一种多进程通信方法——管道。

管道分为有名管道和无名管道。无名管道用于有亲缘关系之间的进程,即父子进程之间。有名管道允许没有亲属关系的进程间使用。管道是连接读写进程的一个共享文件,允许进程以先进先出的方式写入和读出数据,发送进程以字符流的形式吧大量数据写入管道尾部,接收进程从管道头部接收数据。管道应互斥使用,大小在定义时就固定下来了,之后不能改变。

无名管道:下面先介绍一下创建无名管道的API

int fds[2];//这里定义管道的文件描述符,其中一个用于读,一个用于写
pipe(fds);//无名管道的创建接口

创建成功之后,fds[0]就相当于管道头部,用于读,fds[1]相当于管道尾部,用于写进程写入数据。

有名管道:下面再介绍一下创建有名管道的API,有名管道的创建与共享内存、消息队列的创建过程都是差不多的,我们都要标记我们创建的I管道,依此来让两个进程能在内存中识别用于通信的管道是哪一个。

//写进程
define FIFO "myfifo"//这里的宏定义就是定义一个管道标识,表明我们创建的管道叫“myfifo”
mkfifo(FIFO, 0666);//mkfifo就是管道创建API,这里名字叫“myfifo”的FIFO管道就创建成功了
fd = open(FIFO, O_WRONLY);//以只写方式打开管道
write(fd, buf, sizeof(buf));
//读进程,前面都一样
define FIFO "myfifo"//这样两个进程就能识别了
mkfifo(FIFO, 0666);
fd = open(FIFO, O_RDONLY);
read(fd, buf, sizeof(buf));

下面我就给出使用有名管道实现的多进程通信的代码:

写进程:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>#define FIFO "myfifo" //创建一个管道通信的键值
#define BUFFER_SIZE 1024int main(int argc, char* argv[]){char buf[BUFFER_SIZE];int real_write;int fd;int rw = 1;//FIFO是否存在,不存在则创建if(access(FIFO, F_OK) == -1){if(mkfifo(FIFO, 0666) < 0 && errno != EEXIST){printf("falied");exit(1);}}if((fd = open(FIFO, O_WRONLY)) == -1){printf("open failed\n");exit(1);}do{printf("请输入要写入管道的内容:\n");fgets(buf, BUFFER_SIZE, stdin);if((real_write = write(fd, buf, BUFFER_SIZE)) > 0){printf("第%d次写入管道:%s\n",rw++, buf);}}while(strlen(buf) != 0);close(fd);exit(0);
}

读进程:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>#define FIFO "myfifo" //创建一个管道通信的键值
#define BUFFER_SIZE 1024int main(int argc, char* agrv[]){char buff[BUFFER_SIZE];int real_read;int fd;int rc = 1;//如果FIFO已经存在则直接往下执行,不存在则创建if(access(FIFO, F_OK) == -1){if(mkfifo(FIFO, 0666) < 0 && errno != EEXIST){//创建一个管道printf("mkfifo failed\n");exit(1);}}//打开管道if((fd = open(FIFO, O_RDONLY)) == -1){printf("open failed\n");exit(1);}while(1){memset(buff, 0, BUFFER_SIZE);if((real_read = read(fd, buff, BUFFER_SIZE)) > 0){printf("第%d次读取管道:%s\n", rc++, buff);}}close(fd);exit(0);
}

读进程和写进程基本上一样的,只是在读写的一点区别。

下面展示一下效果,我在Ubuntu中编译之后运行:


我是河边小乌龟爬,学习嵌入式软件开发路上的一名小学生,欢迎大家相互交流哇。更多内容关注公众号:河边小乌龟爬。

Linux多进程间通信——管道通信实现相关推荐

  1. Linux下进程间通信-------管道通信

    先来看原理: 特点 : 1.半双工的通信方式(通信期间双方都可以发送/接收文件,但是不能双方同时发送/接收数据) 2.pipe只能用于父子进程间的通信 3.mkfifo可用于任意进程间的通信 代码逐步 ...

  2. Linux系统无名管道通信实验,Linux进程间通信(二)---管道通信之无名管道及其基础实验...

    管道简介 管道是Linux中进程间通信的一种方式,它把一个程序的输出直接连接到另一个程序的输入(其实我更愿意将管道比喻为农村浇地的管子).Linux的管道主要包括两种:无名管道和有名管道.这一节主要讲 ...

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

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

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

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

  5. Linux下进程间通信——管道

    进程间通信 一.进程间通信 1.进程间通信--管道 (1)有名管道的创建 (2)有名管道的操作 写操作 读操作 发生阻塞和关闭程序的几种情况 2.无名管道的创建 (1)无名管道的操作 3.管道读取数据 ...

  6. Linux进程间通信——管道通信

    目录 一.Linux进程间通信概述 1.UNIX平台进程通信方式 2.常用的进程间通信方式 二.无名管道PIPE 1.无名管道的特点: 2.无名管道的创建与关闭 创建无名管道 无名管道的读写 无名管道 ...

  7. Unix网络编程--进程间通信--管道通信

          所有式样的Unix都提供管道,它由 pipe 函数创建,提供一个单路(单向)数据流.       原型如下: #include <unistd.h> int pipe(int ...

  8. Linux之进程间通信②——管道(pipe、fifo)

    在六种进程间通信方式中,管道是最简单.效率最差的一种,管道属于半双工通信,即可以实现双向通信,但不能在两个方向上同时进行,必须交替进行 管道类型分为两种:匿名管道和命名管道 匿名管道:指不带名字标识的 ...

  9. linux关于管道通信,球热心人帮忙 关于linux环境下管道通信

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 谁可以帮我解释一下下面这个程序和结果,要详细点,谢谢了! 主要是父进程写,子进程读,结果会是什么样,为什么 #include #include #incl ...

  10. linux下进程间管道通信,Linux下进程间通信方式-管道

    本文关键字: linux 管道通信,linux 进程通信方式,无名管道,有名管道 管道是Linux中进程间通信的一种方式,它把一个程序的输出直接连接到另一个程序的输入.Linux的管道主要包括两种:无 ...

最新文章

  1. ubuntu apt安装lamp
  2. 杭电2097--Sky数
  3. 数据访问函数库 for ado.net2.0
  4. 【面试必会】java虚拟机原理
  5. Linux 网络编程详解四(流协议与粘包)
  6. 神奇的编码C语言,神奇的fans (C语言代码)
  7. typescript的基本类型
  8. 屌丝就爱尝鲜头——java8再判断
  9. mysql对所有id求积_MySQL学习笔记(二)—查询
  10. 《信息系统项目管理师教程》目录
  11. SWAT模型高阶应用暨无资料地区建模、不确定分析与气候变化、土地利用对面源污染影响模型改进案例分析
  12. 数值分析思考题(钟尔杰版)参考解答——第六章
  13. Android MTK 预制应用遇到的问题
  14. 【包邮送书活动】20210928期-开奖通知
  15. 浅谈如何加强企业成本管理
  16. AI领域各个方向大牛博客汇总
  17. 泛融等多家业界权威通力合作,联合信通院发布《区块链供应链金融白皮书》
  18. 秀米怎么用html模板,秀 米 模 板 不 够 用 ?
  19. 静态语言采用什么方式执行 如c语言,编程语言的两种执行方式
  20. 软件工程概论-- 详细设计,过程设计的6大工具:程序流程图,判定表,N-S图和判定树之间的区别, PAD图的优点?

热门文章

  1. JDB调试代码 20165324 何春江
  2. 设计模式---004策略模式(转载自我的老师 Alley-巷子)
  3. python语言表白语句简单_简短的表白情话
  4. 在线Spirte图定位工具,自动生成CSS
  5. 一图看懂RTB广告竞价原理,原来这就是实时竞价
  6. Android 科大讯飞语音评测SDK 踩坑实录
  7. android 多个按键精灵,Android 一种通用的按键精灵的实现思路
  8. STM32F7+STM32CubeMX5.21+SD+FATFS
  9. 启发式算法与机器学习的区别_使用强化学习训练受启发的四足机器人
  10. 超越传统微调!Meta新作VPT:视觉Prompt来了!冻结主干,仅调节1%参数,性能提升显著!...