【C++】Windows下共享内存加信号量实现进程间同步通信

目录

函数清单

1.CreateFileMapping 方法

2.OpenFileMapping 方法

3.MapViewOfFile 方法

4.UnmapViewOfFile 方法

5.CreateSemaphore 方法

6. OpenSemaphore 方法

7.WaitForSingleObject 方法

8.ReleaseSemaphore 方法

9.CloseHandle 方法

10.GetLastError 方法


函数清单

1.CreateFileMapping 方法

HANDLE CreateFileMapping(
  [in]           HANDLE                hFile,
  [in, optional] LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
  [in]           DWORD                 flProtect,
  [in]           DWORD                 dwMaximumSizeHigh,
  [in]           DWORD                 dwMaximumSizeLow,
  [in, optional] LPCWSTR               lpName
);

功能

  • 创建或打开命名或未命名的共享内存对象。

参数

  • hFile:创建共享内存则设置为 INVALID_HANDLE_VALUE,并且还必须为 dwMaximumSizeHigh 和 dwMaximumSizeLow 参数中的文件映射对象指定大小
  • lpFileMappingAttributes:共享内存对象的安全属性,通常设置为 NULL,则子进程无法继承句柄,并且共享内存对象获取默认的安全描述符。
  • flProtect:指定共享内存对象的访问方式。通常设置为 PAGE_EXECUTE_READWRITE,表示可进行只读、写入复制、读/写或执行访问。
  • dwMaximumSizeHigh:高位字节大小,通常设置为0。
  • dwMaximumSizeLow:地位字节大小,设置共享内存段的大小。
  • lpName:共享内存对象的标识名称。

返回值

  • 如果函数成功,则返回值是新创建的共享内存对象的句柄。
  • 如果该对象在函数调用之前存在,则函数将返回现有对象的句柄 (其当前大小,而不是指定的大小) , GetLastError 返回 ERROR_ALREADY_EXISTS
  • 如果函数失败,则返回值为 NULL。 要获得更多的错误信息,请调用 GetLastError。

2.OpenFileMapping 方法

HANDLE OpenFileMapping(
  [in] DWORD   dwDesiredAccess,
  [in] BOOL    bInheritHandle,
  [in] LPCWSTR lpName
);

功能

  • 打开命名共享内存对象。

参数

  • dwDesiredAccess:对共享内存对象的访问方式。用于共享内存段的保护,通常设置为 FILE_MAP_ALL_ACCESS,可执行所有访问权限。
  • bInheritHandle:如果此参数为 TRUE, 则 CreateProcess 函数创建的进程可以继承句柄;否则,无法继承句柄。
  • lpName:要打开的共享内存对象的标识名称。

返回值

  • 如果函数成功,则返回值是指定共享内存对象的打开句柄。
  • 如果函数失败,则返回值为 NULL。 要获得更多的错误信息,请调用 GetLastError。

3.MapViewOfFile 方法

LPVOID MapViewOfFile(
  [in] HANDLE hFileMappingObject,
  [in] DWORD  dwDesiredAccess,
  [in] DWORD  dwFileOffsetHigh,
  [in] DWORD  dwFileOffsetLow,
  [in] SIZE_T dwNumberOfBytesToMap
);

功能

  • 将共享内存映射到调用进程的地址空间。

参数

  •  hFileMappingObject:共享内存对象的句柄。 CreateFileMapping 和 OpenFileMapping 函数返回此句柄。
  • dwDesiredAccess:对共享内存对象的访问方式,通常指定为FILE_MAP_ALL_ACCESS,表示可读可写。
  • dwFileOffsetHigh:高位字节大小,通常设置为0。
  • dwFileOffsetLow:地位字节大小,通常设置为0。
  • dwNumberOfBytesToMap:要映射到共享内存段的字节数。 

返回值

  • 如果函数成功,则返回值为共享内存段的起始地址。
  • 如果函数失败,则返回值为 NULL。 要获得更多的错误信息,请调用 GetLastError。

4.UnmapViewOfFile 方法

BOOL UnmapViewOfFile(
  [in] LPCVOID lpBaseAddress
);

功能

  • 从调用进程的地址空间取消映射共享内存段。

参数

  • lpBaseAddress:指向要取消映射的共享内存指针。此值必须与上一次调用MapViewOfFile 函数返回的值相同。

返回值

  • 如果该函数成功,则返回值为非零值。
  • 如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。

5.CreateSemaphore 方法

HANDLE CreateSemaphore(
  [in, optional] LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
  [in]           LONG                  lInitialCount,
  [in]           LONG                  lMaximumCount,
  [in, optional] LPCWSTR               lpName
);

功能

  • 创建或打开命名或未命名的信号量对象。

参数

  • lpSemaphoreAttributes:信号量安全特征。通常指定为 NULL,但子进程无法继承句柄。
  • lInitialCount:信号量对象的初始可使用资源数目。 此值必须>=0,并且<=lMaximumCount。如果设置为0,信号量为未触发状态。
  • lMaximumCount:信号量对象的最大资源计数。 此值必须大于零。
  • lpName:信号量对象的名称。各进程实现同步会用到该名称。

返回值

  • 如果函数成功,则返回值是信号量对象的句柄。
  • 如果在函数调用之前存在相同命名的信号量对象,则函数将返回现有对象的句柄,GetLastError 返回 ERROR_ALREADY_EXISTS
  • 如果函数失败,则返回值为 NULL。 要获得更多的错误信息,请调用 GetLastError。

6. OpenSemaphore 方法

HANDLE OpenSemaphore(
  [in] DWORD   dwDesiredAccess,
  [in] BOOL    bInheritHandle,
  [in] LPCWSTR lpName
);

功能

  • 打开现有的命名信号量对象。

参数

  • dwDesiredAccess:对信号量对象的访问权限,通常指定为 SEMAPHORE_ALL_ACCESS
  • bInheritHandle:如果此值为 TRUE,则此过程创建的进程将继承句柄。 否则,进程不会继承此句柄。
  • lpName:打开已有的信号量名称。

返回值

  • 如果函数成功,则返回值是信号灯对象的句柄。
  • 如果函数失败,则返回值为 NULL。 要获得更多的错误信息,请调用 GetLastError。

7.WaitForSingleObject 方法

DWORD WaitForSingleObject(
  [in] HANDLE hHandle,
  [in] DWORD  dwMilliseconds
);

功能

  • 阻塞等待指定对象处于信号状态或超时间隔已过。

参数

  • hHandle:创建的信号量对象的句柄。
  • dwMilliseconds:超时间隔(以毫秒为单位)。通常指定为 INFINITE,表示仅当发出对象信号时,该函数才会返回。

返回值

  • 如果函数成功,则返回值指示导致函数返回的事件。可以是下列值之一
返回代码/值 描述

WAIT_ABANDONED

指定的对象是一个互斥对象,该对象不是由拥有互斥对象的线程在拥有线程终止之前释放的。 互斥对象所有权授予调用线程,互斥状态设置为非对齐状态。如果互斥体保护持久状态信息,则应检查该信息是否一致性。

WAIT_OBJECT_0

指定对象的状态已发出信号。

WAIT_TIMEOUT

超时间隔已过,对象的状态未对齐。

WAIT_FAILED

函数失败。 要获得更多的错误信息,请调用 GetLastError。

8.ReleaseSemaphore 方法

BOOL ReleaseSemaphore(
  [in]            HANDLE hSemaphore,
  [in]            LONG   lReleaseCount,
  [out, optional] LPLONG lpPreviousCount
);

功能

  • 按指定量增加指定的信号量对象的资源计数。

参数

  • hSemaphore:设置为 CreateSemaphore 或 OpenSemaphore 函数返回的信号量对象句柄。
  • lReleaseCount:信号量对象的当前资源计数将增加的量。该值必须>0且<=最大资源数量,通常设置为1。
  • lpPreviousCount:指向一个变量的指针,用于接收信号量的先前资源计数。如果不需要先前资源计数,此参数可以为 NULL 

返回值

  • 如果该函数成功,则返回值为非零值。
  • 如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。

9.CloseHandle 方法

BOOL CloseHandle(
  [in] HANDLE hObject
);

功能

  • 关闭打开的对象句柄。

参数

  • hObject:打开对象的有效句柄。

返回值

  • 如果该函数成功,则返回值为非零值。
  • 如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。

10.GetLastError 方法

_Post_equals_last_error_ DWORD GetLastError();

功能

  • 检索调用线程的最后错误代码值。 最后一个错误代码是按线程维护的。 多个线程不会覆盖彼此的最后错误代码。

返回值

  • 返回值是调用线程的最后错误代码。

猜你喜欢

转载自blog.csdn.net/weixin_43729127/article/details/131173653
今日推荐