使用匿名管道做进程通信,需要用父进程创建一个子进程,该子进程的标准输入输出句柄由父进程指定。

无论父进程还是子进程,都可以收发数据,这里仅演示父进程发数据,子进程打印数据。
父进程循环从控制台读数据,并发送给子进程,子进程用对话框打印数据,约定子进程收到"quit"后退出。

父进程(发送端)

#define _CRT_SECURE_NO_WARNINGS
#include <Windows.h>
#include <stdio.h>HANDLE g_hRead, g_hWrite;BOOL CreateChildProcess()
{// 创建可继承的匿名管道,可以理解成输入输出设备   SECURITY_ATTRIBUTES sa;sa.bInheritHandle = TRUE;sa.lpSecurityDescriptor = NULL;sa.nLength = sizeof(SECURITY_ATTRIBUTES);if (!CreatePipe(&g_hRead, &g_hWrite, &sa, 0)){printf("创建匿名管道失败\n");return FALSE;}// 创建子进程,设置标准输入输出设备STARTUPINFO si;PROCESS_INFORMATION pi;ZeroMemory(&si, sizeof(STARTUPINFO));si.cb = sizeof(STARTUPINFO);si.dwFlags = STARTF_USESTDHANDLES;si.hStdInput = g_hRead;si.hStdOutput = g_hWrite;si.hStdError = GetStdHandle(STD_ERROR_HANDLE);if (FALSE == CreateProcess(TEXT("C:\\Users\\gsy\\source\\repos\\2020年暑假学习\\Debug\\匿名管道-接收端.exe"), NULL, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)){//printf("创建进程失败\n");CloseHandle(g_hRead);CloseHandle(g_hWrite);g_hRead = g_hWrite = NULL;return FALSE;}else{CloseHandle(pi.hProcess);CloseHandle(pi.hThread);}return TRUE;
}void SendData()
{char szBuffer[0x100];scanf("%s", szBuffer);DWORD dwWrite = 0;if (!WriteFile(g_hWrite, szBuffer, strlen(szBuffer) + 1, &dwWrite, NULL)){printf("写数据失败\n");}
}int main()
{if (CreateChildProcess()){printf("创建子进程成功,输入要发送的数据,输入quit杀死子进程\n");}else{printf("创建子进程失败\n");}while (true){SendData();}return 0;
}

子进程(接收端)

#include <windows.h>
#include <stdio.h>int main()
{HANDLE hRead = GetStdHandle(STD_INPUT_HANDLE);HANDLE hWrite = GetStdHandle(STD_OUTPUT_HANDLE);char szBuffer[0x100];DWORD dwRead = 0;while (true){ReadFile(hRead, szBuffer, 0x100, &dwRead, NULL);if (strcmp(szBuffer, "quit") == 0){printf("quit!\n");break;}printf("%s\n", szBuffer);MessageBoxA(0, szBuffer, "子进程接收到的数据", MB_OK);}return 0;
}

运行结果(运行父进程程序)

进程间通信——匿名管道相关推荐

  1. 进程间通信 - 匿名管道实现

    引子 前面的两篇博文分别介绍了通过剪贴板和通过邮槽来实现进程之间的通信, 其中剪贴板呢,是用来实现本地两个进程之间的通信, 而邮槽则既可以实现本地两个进程之间的通信,也可以实现本地进程和服务器进程的通 ...

  2. 【Linux】进程间通信 —— 匿名管道 | 命名管道 | System V | 消息队列 | 共享内存

    进程间通信 0. 进程间通信 1. 管道 1.1 匿名管道 1.1.1 匿名管道原理 1.1.2 创建匿名管道pipe 1.1.3 基于匿名管道通信的4种情况5个特点 1.2 命名管道 1.2.1 创 ...

  3. 进程间通信(匿名管道)

    1.进程通信的目的     (1) 数据传输: 一个进程需要将它的数据传输给另一个进程     (2) 资源共享: 多个进程之间共享同样的资源     (3) 通知事件: 一个进程需要向另一个或一组进 ...

  4. 进程间通信(7) “剪贴板“、“匿名管道“、“命名管道“、“邮槽“4种方式总结

    1. 剪贴板和匿名管道只能同一-台机器上 命名管道和邮槽还可以实现跨网络的进程间通信; 邮槽是基于广播通信的,可以一对多的单向通信, 数据量较小,通常都是在424字节以下 命名管道只能点对点的单一的通 ...

  5. Linux系统编程27:进程间通信之管道的基本概念和匿名管道与命名管道及管道特性

    文章目录 (1)管道是什么 (2)匿名管道 A:读端和写端 B:建立匿名管道的函数 C:最简单的进程间通信-演示 D:管道四大特性 E:管道的特点 F:从内核角度理解管道 G:管道总结 (3)命名管道 ...

  6. 进程间通信(匿名管道、命名管道、共享内存)

    进程间通信 进程间通信的作用 管道 匿名管道 命令感受匿名管道 从内核角度去解释匿名管道 代码创建匿名管道 从PCB角度去分析匿名管道 匿名管道的非阻塞读写特性 创建管道,获取管道读写两端文件描述符的 ...

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

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

  8. #Linux#进程间通信# 管道(pipe)-匿名管道pipe

    我们通常把一个进程连接到另一个进程的一个数据流称为一个"管道",通常是用作把一个进程的输出通过管道连接到另一个进程的输入.管道本质上是内核的一块缓存.内核使用环形队列机制,借助内核 ...

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

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

最新文章

  1. 人大附中「内卷」到了美国?华裔家长抗议中国学生持F1签证抢占美国IMO名额...
  2. CORDIC算法——圆周系统之旋转模式
  3. 关于在 Ubuntu 上安装 SteamOS session
  4. mysql建表用的什么语句_mysql建表常用sql语句个人经验分享
  5. C#中二进制和流之间的各种相互转换
  6. python中if __name__ == ‘__main__‘:的简单理解
  7. C++中的sort函数对二维数组排序是按照什么准则?
  8. C4D优质电商背景素材|分分钟搞定设计稿
  9. EntytyFramework批量更新
  10. 机房收费系统可行性研究报告
  11. JS中this的四种调用方法
  12. c语言中应用程序错误,大师搞定win7系统提示应用程序错误0xc0000409的解决方案
  13. 猫游记页游mysql_5款曾经极其火爆的页游,最后一款90后没听过80后才玩过
  14. 被遗忘的数学家!曾提出最接地气的数学定理,可以计算男朋友真不真心的那种......
  15. 【字符串】Hash表
  16. 视觉学习笔记6——YOLOv5(v6.2)部署与代码理解
  17. SSL/TLS原理和通信过程分析
  18. 【转】强悍的搞笑语录,老衲再也忍…
  19. django+vue实现搜索功能
  20. MES系统生产过程管理解决方案,主要包含哪些功能模块?

热门文章

  1. vue在js上处理后台返回的数组_vuejs 根据后台返回数组,渲染图片路径
  2. 成功解决Exception “unhandled ModuleNotFoundError“No module named ‘sklearn.neighbors.classification‘
  3. ML之多分类预测:以某个数据集为例从0到1深入理解科学预测之多分类问题的思路框架
  4. PS:将webp后缀图片最简单最快速的方法另存为png后缀的图片
  5. 蓝桥杯_算法训练_字串统计
  6. LeetCode:汇总区间【228】
  7. as3.0用了视频组件,导致视频打开后就全屏,加一下代码就行
  8. java基础----Runtime类的使用(一)
  9. linux系统解决boot空间不足
  10. 2016百度编程题:钓鱼比赛