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);
}