在将这个题目之前大家需要了解几个概念:

进程: 我们可以先看进程的定义:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础;在当总结起来就是:进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

程序和进程之间的关系又是什么样子呢?一般情况下,我们启动一个程序系统就会启动一个(有时候会有多个进程)。所以程序是静态的代码,进程是程序运行时产生的活动。启动一个程序时可以产生一个或若干个进程。进程实际上是程序当中正在执行的代码(可能只是整个程序的一部分代码)所产生的一个活动对象。

我们可以通过任务管理器查看与管理进程。

线程间我们知道可以通过变量或者公共资源来进行数据交换,那么进程之间呢?进程间通讯一般有这几种方式:管道( pipe )、有名/命名管道 (named pipe) 、信号量( semophore )、消息队列( message queue ) 、信号 ( sinal ) 、共享内存( shared memory ) 、套接字( socket );今天主要讲的是命名管道,其他的大家有兴趣的可以去了解。

管道和命名管道的区别

管道是一种两个进程间进行单向通信的机制。因为管道传递数据的单向性,管道又称为半双工管道。管道的这一特点决定了器使用的局限性。管道是Linux支持的最初Unix IPC形式之一,具有以下特点:

数据只能由一个进程流向另一个进程(其中一个读管道,一个写管道);如果要进行双工通信,需要建 立两个管道;

管道只能用于父子进程或者兄弟进程间通信。,也就是说管道只能用于具有亲缘关系的进程间通信。

1、命名管道的定义和特点

FIFO又名有名管道或命名管道。POSIX标准中管道是没有名称的,所以它的最大劣势是只能用于具有亲缘关系的进程间的通信。FIFO最大的特性就是每个FIFO都有一个路径名与之相关联,从而允许无亲缘关系的任意两个进程间通过FIFO进行通信。所以,FIFO有以下特性:

和管道一样,FIFO仅提供半双工的数据通信,即只支持单向的数据流;

和管道不同的是,FIFO可以支持任意两个进程间的通信。

FIFO 在文件系统中作为一个特殊的文件而存在,但 FIFO 中的内容却存放在内存中。

当使用 FIFO 的进程退出后,FIFO 文件将继续保存在文件系统中以便以后使用。

FIFO 有名字,不相关的进程可以通过打开命名管道进行通信。

命名管道实现原理图示

首先要引入头文件#include ,类似Socket编程,要分服务端和客户端。首先简单看一下实现流程:

服务器端命名管道实现的步骤:

第一需要先创建命名管道CreateNamedPipe;其次等待客户端连接ConnectNamedPipe

然后接收客户端发送数据ReadFile & 向客户端发送数据WriteFile;最后通讯完成关闭管道CloseHandle;

再看客户端命名管道实现的步骤:

首先在客户端中判断是否有可以用的命名管道WaitNamedPipe;如果有则打开管道CreateFile然后接收客户端发送数据ReadFile & 向客户端发送数据WriteFile;最后通讯完成关闭管道CloseHandle;

我们看一下CreateNamedPipe()函数原型:

HANDLE CreateNamedPipe(

LPCTSTR lpName, // 指向管道名称的指针

DWORD dwOpenMode, // 管道打开模式

DWORD dwPipeMode, // 管道模式

DWORD nMaxInstances, // 最大实例数

DWORD nOutBufferSize, // 输出缓存大小

DWORD nInBufferSize, // 输入缓存大小

DWORD nDefaultTimeOut, // 超时设置

LPSECURITY_ATTRIBUTES lpSecurityAttributes // 安全属性指针

);

通讯过程示意图如下:(仅代表个人理解,并不代表权威)

通讯过程示意图

小编做了两张通讯调试的gif截图,大家结合截图和后面的代码就能更清楚的了解整个过程了:

ReadFile方法会阻塞线程阻塞等待服务器写入数据并读取出来

ReadFile阻塞等待服务器写入数据

WriteFile方法会阻塞线程等待管道内数据被读取

WriteFile阻塞等待数据被读取

命名管道通讯源码

最后附上源代码:

服务端:

#include #include #include #include using namespace std;void main(){ DWORD r = 0; DWORD w = 0; char msg[256] ='' ; HANDLE pip_handle = CreateNamedPipe('\\\\.\\Pipe\\pipe_test', PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, PIPE_UNLIMITED_INSTANCES, 0, 0, 2000, NULL); // 创建命名管道 if (pip_handle == INVALID_HANDLE_VALUE) cout<< 'creat failed!'<

客户端:#include #include #include #include using namespace std;void main(){DWORD w = 0 ;DWORD r = 0 ;char msg[256]= 'server i love u' ;//WaitNamedPipe('\\\\.\\Pipe\\pipe_test',NMPWAIT_WAIT_FOREVER);if(WaitNamedPipe('\\\\.\\Pipe\\pipe_test',NMPWAIT_WAIT_FOREVER)){cout<

END

纯手KEY,希望大家多多支持小编,点个关注~~~

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

  1. linux 命名管道 c语言 不同进程,进程间通信 - 命名管道实现

    命名管道概述 命名管道是通过网络来完成进程之间的通信的,命名管道依赖于底层网络接口, 其中包括有 DNS 服务,TCP/IP 协议等等机制,但是其屏蔽了底层的网络协议细节, 对于匿名管道而言,其只能实 ...

  2. 进程间通信 - 命名管道实现

    引子 好,到这里呢,就需要介绍实现进程间通信的第四种方式了, 也就是通过命名管道来实现,前面介绍的那三种方式呢,都是有缺陷或者说局限性太强, 而这里介绍的命名管道相对来说,在这方面就做得好很多了, 比 ...

  3. IPC--进程间通信二(命名管道)

    在前一篇文章中,我们看到了如何使用匿名管道来在进程之间传递数据,这个方式有一个缺陷,就是这些进程必须由一个共同的祖先进程启动,这在不相关的的进程之间交换数据带来了不便.而另一种通信方式--命名管道,可 ...

  4. linux pipe 命名管道,linux 进程学习笔记-named pipe (FIFO)命名管道

    与"无名管道"不同的是,FIFO拥有一个名称来标志它,所谓的名称实际上就是一个路径,比如"/tmp/my_fifo",其对应到磁盘上的一个管道文件,如果我们用f ...

  5. 进程间通信--命名管道

    几个术语 二义性:当我们往一个管道里面写端写数据的时候,比如写一个hello的时候,当我们写到he的时候,读端就已经开始读取数据了,所以这是不对的,这就是二义性 临界资源:多个流可以访问的一个共同的存 ...

  6. linux 进程间通信 命名管道FIFO的原理与使用

    参考文章1:管道 pipe是什么?(进程通信的一种方式)(可以先大致了解管道) 参考文章2:FIFO(命名管道) FIFO常被称为命名管道,以区分管道(pipe).管道(pipe)只能用于" ...

  7. 【Linux】进程间通信-命名管道FIFO

    命名管道概述 如果我们要在不相关的进程间交换数据,那么使用FIFO文件将会十分方便. FIFO文件通常也称为命名管道(named pipe).命名管道是一种特殊类型的文件,它在文件系统中以文件名的形式 ...

  8. 进程间通信 —— 命名管道

    管道包括三种: 1):普通管道PIPE,通常有很多限制,一是半双工,只能单向传输,二是只能在父子进程间使用 2):流管道:这种能双向传输,但是也是只能父子进程间使用. 3):命名管道,去除了以上的第二 ...

  9. 进程间通信——命名管道

    服务端 // 规定创建命名管道的程序是服务端 // 本程序服务端负责接收数据并打印 #include <stdio.h> #include <Windows.h>BOOL Se ...

最新文章

  1. web应用的绝对路径和相对路径
  2. mysql 事务id_[转]MySQL 5.6 全局事务 ID(GTID)实现原理(一)
  3. 根据功率计算用电量和电费
  4. Appfuse:记录操作日志
  5. 渗透测试之子域到父域的横向移动(Sid History)
  6. 如何使用 Laravel Collections 类编写神级代码
  7. linux awk 教程,Linux awk使用案例教程
  8. error LNK2001: unresolved external symbol _WinMain@16
  9. 隔年增长的题_资料分析——隔年增长
  10. 爬虫-访问用户中心页面-服务端做了些什么
  11. 移动互联网时代,学iOS开发好吗
  12. node js并发加载页面缓慢_详解如何利用前端Node模块zlib开启gzip压缩使页面加载速度更快...
  13. 【企业架构框架】2022 年 TOGAF 的新发展
  14. 冰点下载:数据解析错误
  15. 【信息系统项目管理师】第八章 质量管理思维导图
  16. treegrid 的使用介绍
  17. 三菱Q系列QJ71C24N模块 MODBUS通信(含完整步骤+源代码)
  18. [Openwrt 项目开发笔记]:Openwrt平台搭建(一)
  19. redis源码分析 -- cs结构之服务器
  20. PHP对接谷歌search console 第一篇

热门文章

  1. python怎样遍历列表中数字_Python基础-列表操作(2):列表的遍历和数字列表
  2. Kotlin - 改良观察者模式
  3. 老罗锤子手机(Smartisan T1)的一些感想
  4. 【Android 应用】小白之签名文件的生成。
  5. TOPSIS--优劣解距离法
  6. Hive-JDBC操作,springcloud高级面试题
  7. 贪心算法训练(七)——加工生产调度(流水作业调度问题)
  8. matlab某奶制品加工厂,奶制品加工问题 - 数学建模.doc
  9. C# 网络爬虫利器之Html Agility Pack如何快速实现解析Html
  10. Rust 错误处理 简记