进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。每个进程都有一个主线程,线程则是cpu调度的基本单位,每个进程都有自己的地址空间,所以进程想要分享自己的资源时需要通讯。

进程间的通讯有管道,socket,消息队列,信号,共享内存等。下面我们来了解命名管道。

管道的实质是一个内核缓冲区,进程以先进先出的方式从缓冲区存取数据:管道一端的进程顺序地将进程数据写入缓冲区,另一端的进程则顺序地读取数据,该缓冲区可以看做一个循环队列,读和写的位置都是自动增加的,一个数据只能被读一次,读出以后再缓冲区都不复存在了。当缓冲区读空或者写满时,有一定的规则控制相应的读进程或写进程是否进入等待队列,当空的缓冲区有新数据写入或慢的缓冲区有数据读出时,就唤醒等待队列中的进程继续读写。

相关api函数:

CreateNamedPipe() 创建命名管道。

ConnectNamedPipe()等待服务器连接。

WaitNamedPipe()等待可连接的管道出现,超时时间内出现返回turn。

CreateFile()  打开管道。

WriteFile() ReadFile() 读写内容。

下面是一个实现管道连接传输的简单例子:

客户端代码完整代码:

#include "stdafx.h"
#include <windows.h>
#include <ctime>#pragma warning( disable : 4996)
int main()
{// srand函数是随机数发生器的初始化函数。//原型:void srand(unsigned int seed);srand和rand()配合使用产生伪随机数序列srand(time(NULL));DWORD rlen = 0;char buf[256] = "";//创建管道HANDLE hPipe = CreateNamedPipe(TEXT("\\\\.\\pipe\\mypipe"), //管道名PIPE_ACCESS_DUPLEX,                //开放模式PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, //管道模式。PIPE_UNLIMITED_INSTANCES,//可以为此管道创建的最大实例数0, //要为输出缓冲区保留的字节数0, //要为输入缓冲区保留的字节数NMPWAIT_WAIT_FOREVER,NULL);if (INVALID_HANDLE_VALUE == hPipe){printf("Create Pipe Error(%d)\n", GetLastError());}else{printf("Waiting For Client Connection...\n");//ConnectNamedPipe是指示一台服务器等待下去,直至客户机同一个命名管道连接。if (ConnectNamedPipe(hPipe, NULL) == NULL) //阻塞等待客户端连接。{printf("Connection failed!\n");}else{printf("Connection Success!\n");}}int i = 10;while (i){if (ReadFile(hPipe, buf, 256, &rlen, NULL) == FALSE) //接受客户端发送过来的内容{printf("Read Data From Pipe Failed!\n");break;}else{printf("From Client: data = %s, size = %d\n", buf, rlen);char wbuf[256] = "你好,客户端";sprintf(wbuf, "%s%d", wbuf, rand() % 10);DWORD wlen = 0;WriteFile(hPipe, wbuf, sizeof(wbuf), &wlen, 0);   //向客户端发送内容printf("To Client: data = %s, size = %d\n", wbuf, wlen);Sleep(1000);}i--;}system("pause");return 0;
}

服务器完整代码:

#include "stdafx.h"
#include <windows.h>
#include <ctime>#pragma warning( disable : 4996)
int main()
{srand(time(NULL));DWORD wlen = 0;//Sleep(1000);//等待pipe的创建成功!//等待命名管道的一个有效实例出现,超时时间时间内有管道则返回turn。BOOL bRet = WaitNamedPipe(TEXT("\\\\.\\Pipe\\mypipe"), NMPWAIT_WAIT_FOREVER);if (!bRet){printf("connect the namedPipe failed!\n");return 0;}HANDLE hPipe = CreateFile(           //管道属于一种特殊的文件TEXT("\\\\.\\Pipe\\mypipe"), //创建的文件名GENERIC_READ | GENERIC_WRITE,   //文件模式0,                                //是否共享NULL,                         //指向一个SECURITY_ATTRIBUTES结构的指针OPEN_EXISTING,                    //创建参数FILE_ATTRIBUTE_NORMAL,            //文件属性(隐藏,只读)NORMAL为默认属性NULL);                          //模板创建文件的句柄if (INVALID_HANDLE_VALUE == hPipe){printf("open the exit pipe failed!\n");}else{//循环10次int i = 10;while (i){char buf[256] = "你好服务器";sprintf(buf, "%s%d", buf, rand() % 10);if (WriteFile(hPipe, buf, sizeof(buf), &wlen, 0) == FALSE)    //向服务器发送内容{printf("write to pipe failed!\n");break;}else{printf("To Server: data = %s, size = %d\n", buf, wlen);char rbuf[256] = "";DWORD rlen = 0;ReadFile(hPipe, rbuf, sizeof(rbuf), &rlen, 0); //接受服务发送过来的内容printf("From Server: data = %s, size = %d\n", rbuf, rlen);}Sleep(1000);i--;}CloseHandle(hPipe);//关闭管道!关闭管道!关闭管道!}system("PAUSE");return 0;
}

运行结果:

注:使用vs2015运行。

进程间通讯 ----- 命名管道相关推荐

  1. linux命名管道进程间通信,Linux进程间通讯--命名管道

    IPC安全 前面总结了匿名管道,如今来看命名管道:因为匿名管道的一个限制就是:只能是有血缘关系的进程间才能够通讯,好比:有两个同祖先的子进程,父子进程等:为了突破这一个限制,想让没有任何关系的两个进程 ...

  2. 【Linux】进程间通讯之管道

    进程间通信的机制包括:管道.信号量.共享内存.消息队列. 这篇博客主要介绍的是进程间通讯之管道的应用 一.管道的分类 管道都属于半双工通讯机制 管道分为有名管道和无名管道 1.有名管道 在磁盘上有一个 ...

  3. linux进程间通讯-有名管道

    文章目录 阻塞和非阻塞概念 通过fcntl函数设置文件的阻塞特性 文件描述符概述 文件描述符的复制 有名管道 有名管道的创建 有名管道的基本读写操作 有名管道实现进程间通信 有名管道的读写规律(阻塞) ...

  4. linux进程间通讯-无名管道

    文章目录 无名管道 无名管道的创建 -- pipe函数 无名管道的读写规律 无名管道 无名管道概述 管道(pipe)又称无名管道. 无名管道是一种特殊类型的文件,在应用层体现为两个打开的文件描述符.任 ...

  5. pipe 半双工_linux进程间通讯之管道(无名管道pipe)实现全双工双向通讯

    管道是什么: 1. 管道只能用于具备亲缘关系的进程之间通讯. 2.管道是一种单工或者说半双工的通讯方式,传递信息的方向是固定的,只能由一端传递到另外一端. 头文件及函数原型: #include int ...

  6. 管道实现进程间通讯 、WaitNamedPipe

    一.管道实现进程间通讯 主要的理论知识 1.什么是管道以及分类 管道是两个头的东西,每一个头各连接一个进程或者同一个进程的不同代码,依照管道的类别分有两种管道,匿名的和命名的:依照管道的传输方向分也能 ...

  7. 进程间通讯 --- 管道(半双工通信)

    管道: 一个进程输出数据到另一个进程数据输入的通道.(半双工通信:同一时间,只能一端读另一端写,因为只有一条信道) 有名管道(命令管道): 在磁盘上会存在一个管道文件标识,但管道文件不占用磁盘bloc ...

  8. linux无名管道实验代码,Linux 进程间通讯之创建无名管道和读写无名管道

    Linux进程间通讯的方式: 1. 管道(pipe)和有名管道(FIFO). 2. 信号(signal) 3. 消息队列 4. 共享内存 5. 信号量 6. 套接字(socket) 管道通讯: 无名管 ...

  9. 进程间通讯(IPC)(有信号捕捉函数)

    1.IPC(Internal Processes Communication) 进程间通讯--->实际上数据的交换. 通过全局变量的方式实现不了进程间通讯 因为进程内存空间,都是相互独立的,不能 ...

最新文章

  1. 2022-2028年中国石油钻井井下工具行业市场研究及前瞻分析报告
  2. 实战:从深度学习探究计算机视觉
  3. DNS 学习笔记之6- DNS区域的管理②
  4. 使用直流稳压电源时的注意事项!
  5. 最烦人的正则表达式记忆口诀
  6. 华为手机所有图标变黑_华为官博科普手机状态栏小图标含义,总共分为4大类...
  7. java 中以||作为split分隔符正确的写法
  8. PHP操作Mongodb API 及使用类 封装好的MongoDB操作类
  9. java质因数算法_Java实现的质因数分解操作示例【基于递归算法】
  10. eplices如何导入外部代码_搜索引擎的蜘蛛是如何爬的
  11. mysql 删除创建表分区,MySQL分区表创建,分区创建、删除示例
  12. java call.invoke_java invoke 以及 webservice详解,求助
  13. Excel批量插入图片小技巧
  14. 视觉里程计 特征点法
  15. 深度学习中Dropout原理解析
  16. iOS开发中向iPhone模拟器中添加视频资源
  17. 牛客每日练习----数的变换,Do you like Banana ?,Liao Han
  18. excel不同文件表格批量加表头vba_多个excel表格自动汇总|如何把两个文件表格用VBA从另一个EXCEL表格导入数据到这个表格中?...
  19. python中def main是什么意思_Python main()函数解析
  20. Win10样式管理与夜间模式

热门文章

  1. GavinNLP星空对话机器人Transformer课程片段2
  2. java relativelayout_用java代码写RelativeLayout的layout_below逻辑,你不知道的坑
  3. 2020考研大纲词汇TXT版本5500
  4. 部署IIS PHP SQL server环境
  5. 孙悟空打死6个凡人,为何还被封了佛?
  6. Linux操作系统基础之软件管理
  7. C#基础-029 数组介绍
  8. aircrack-ng 破解无线网络
  9. 记录c++连接数据库案例(Windows平台、vs2022)
  10. xpath自定义属性值的取法