互斥体的多进程通信
2021-08-30
60
0
时常需要进行多进程进行通讯,比如说进程A产生了一件事件,而进程B需要及时的知道这个事件,进行某些操作。
这时我们可以这样操作
1.b进程创建一个全局命名互斥体
2.b进程等待事件
3.a进程打开个这个互斥体
4.a进程释放这个互斥体
注意:
这个互斥体如为了跨session,请一定给这个命名加上Global前缀,否则只能在同一用户session下使用,且要设置其安全局性。
题外话:
这个其实就是使用我们常说的多进程之间的通讯方式,其中互斥体就是其中一样,其它的比如事件,管道等,都是使用的是内核对象来实现的,而共享内存变量内是将同一片物理地址空间映射到不同的进程虚拟地址空间的,这样操作A进程空间的内存,就像操作B进程空间的。
进程A
#include "stdafx.h"
#include<Windows.h>
#include<stdio.h>
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE mutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, TEXT("Global\AA111"));
if (mutex == NULL)
{
_tprintf(TEXT("OPEN MUTEXT ERROR %d"),GetLastError());
return 0;
}
//ReleaseMutex(mutex);
static int i = 0;
while (true)
{
WaitForSingleObject(mutex, INFINITE);
_tprintf(TEXT("mu2 %dn"), i++);
Sleep(3000);
ReleaseMutex(mutex);
_tprintf(TEXT("setn"));
}
CloseHandle(mutex);
return 0;
}
进程B
#include "stdafx.h"
#include<Windows.h>
#include<stdio.h>
int _tmain(int argc, _TCHAR* argv[])
{
SECURITY_DESCRIPTOR secutityDese;
::InitializeSecurityDescriptor(&secutityDese, SECURITY_DESCRIPTOR_REVISION);
::SetSecurityDescriptorDacl(&secutityDese, TRUE, NULL, FALSE);
SECURITY_ATTRIBUTES securityAttr;
// set SECURITY_ATTRIBUTES
securityAttr.nLength = sizeof SECURITY_ATTRIBUTES;
securityAttr.bInheritHandle = FALSE;
securityAttr.lpSecurityDescriptor = &secutityDese;
HANDLE mutex = CreateMutex(&securityAttr, FALSE, TEXT("Global\AA111"));
static int i = 0;
while (true)
{
WaitForSingleObject(mutex, INFINITE);
_tprintf(TEXT("mu1 %dn"), i++);
Sleep(200);
ReleaseMutex(mutex);
_tprintf(TEXT("setn"));
}
CloseHandle(mutex);
return 0;
}