C++进阶(应用篇)——第二章 进程间的通信

本文详细介绍了Windows平台下进程间的通信方式,重点讲解了共享内存和命名管道的概念及其实现。通过示例代码展示了如何在C++中创建和使用共享内存进行数据传输,并解释了如何利用Mutex和Event实现同步。此外,还介绍了命名管道的创建、读写操作,以及其在进程间通信中的应用。
摘要由CSDN通过智能技术生成

2.进程间的通信

2.1进程

本章讲解windows平台下,进程间的通信方式。

进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,是操作系统动态执行的基本单元。简单的说,进程就是一段程序的执行过程。

进程和线程:进程是系统动态执行的基本单位,也是系统分配资源的基本单位;线程是进程中执行的最小单位,它可以访问进程的共享资源。

进程之间对共享内存等进行读写操作,需要使用互斥机制,常使用Mutex;进程的同步机制包括Event、Semaphore,常使用Semaphore。

进程间的通信不仅包括进程的同步互斥,还包括进程间数据的传输。

进程间常用的通信方式:共享内存、管道、信号量、端口。其中Mutex和Event放在共享内存中讲解,端口会在网络编程那章讲解。

2.2 Shared Memory

Shared Memory称为共享内存,它是进程间数据传输最快的通信方式。由于共享内存是所有进程都可以访问,因此共享内存的操作需要加锁。

现在实现进程A和进程B,进程A对共享内存写数据,进程B对共享内存读数据。

//进程A

#include <iostream>

#include <Windows.h>

 

using namespace std;

#define BUF_SIZE 4096

HANDLE H_Mutex = NULL;

HANDLE H_Event = NULL;

 

int main(int argc,char ** argv)

{

//步骤1:创建共享文件句柄

HANDLE shared_file = CreateFileMapping(

INVALID_HANDLE_VALUE,//物理文件句柄

NULL,  //默认安全级别

PAGE_READWRITE,      //PAGE_READWRITE表示可读可写,PAGE_READONLY表示只读,PAGE_WRITECOPY表示只写

0,  //高位文件大小

BUF_SIZE,  //低位文件大小

L"ShareMemory"  //共享内存名称

);  

if (shared_file == NULL)

{

cout<<"Could not create file mapping object..."<<endl;

return 1;

}

//步骤2:映射缓存区视图,得到指向共享内存的指针

LPVOID lpBUF = MapViewOfFile(

shared_file, //已创建的文件映射对象句柄

FILE_MAP_ALL_ACCESS,//访问模式:可读写

0, //文件偏移的高32位

0, //文件偏移的低32位

BUF_SIZE //映射视图的大小

);

if (lpBUF == NULL)

{

cout << "Could not create file mapping object..." << endl;

CloseHandle(shared_file);

return 1;

}

H_Mutex = CreateMutex(NULL, FALSE, L"sm_mutex");

H_Event = CreateEvent(NULL, FALSE, FALSE, L"sm_event");

 

//步骤3:操作共享内存

char Buffer[97];

while (1)

{

cout << "A proccess:Please input the content to the process B" << endl;

cin.getline(Buffer,97);

cout << "Buffer: " <<Buffer<< endl;

WaitForSingleObject(H_Mutex, INFINITE); //使用互斥体加锁

memcpy(lpBUF, Buffer, strlen(Buffer)+1);

ReleaseMutex(H_Mutex); //放锁

SetEvent(H_Event);

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值