C++进程间通信(windows)

C++ 进程间通信方式

1,共享内存;
2,管道;
3,信号量
进程1测试代码如下:

#include <Windows.h>
#include <iostream>
/*********************1 共享内存**********************/
HANDLE myHMutex;
HANDLE myHEvent;
BOOL SharedMemoryFun();
/*********************2 命名管道**********************/
#define MY_PIPE_NAME "\\\\.\\pipe\\mypipe"
BOOL PipeFun();
/*********************3 信号量************************/
HANDLE myHSemaphore;
BOOL SemaphoreFun();

int main()
{
	/*if (SharedMemoryFun() == FALSE)
	{
	std::cout<<"SharedMemoryFun ERROR"<<std::endl;
	}*/
	
	/*if (PipeFun() == FALSE)
	{
	std::cout<<"PipeFun ERROR"<<std::endl;
	}*/

	if (SemaphoreFun() == FALSE)
	{
		std::cout<<"SemaphoreFun ERROR"<<std::endl;
	}

	system("pause");
	return 0;
}

BOOL SharedMemoryFun()
{
	//创建共享文件句柄
	HANDLE myhandle = CreateFileMapping(INVALID_HANDLE_VALUE,
		NULL,//安全级别
		PAGE_READWRITE,
		0,//高位文件大小
		1024,//低位文件大小
		"MYSM");//共享文件名称
	if (myhandle == NULL)
	{
		return FALSE;
	}

	//映射
	LPVOID lpbuf = MapViewOfFile(myhandle, 
		FILE_MAP_ALL_ACCESS,
		0,
		0,
		1024);
	if (lpbuf == NULL)
	{
		return FALSE;
		CloseHandle(myhandle);
	}

	myHMutex = CreateMutex(NULL, FALSE, "MYMUTEX");
	myHEvent = CreateEvent(NULL, FALSE, FALSE, "MYEVENT");

	while(TRUE)
	{
		char buf[128];
		std::cout<<"*************Send Message**********************"<<std::endl;
		std::cin.getline(buf, 128);

		WaitForSingleObject(myHMutex, INFINITE);
		memcpy(lpbuf, buf, strlen(buf));
		ReleaseMutex(myHMutex);
		SetEvent(myHEvent);
		if (buf[0] == 'q')
		{
			break;
		}
	}

	CloseHandle(myHEvent);
	CloseHandle(myHMutex);

	UnmapViewOfFile(lpbuf);
	CloseHandle(myhandle);
	return TRUE;
}

BOOL PipeFun()
{
	HANDLE myHPipe = CreateNamedPipe(
		MY_PIPE_NAME,
		PIPE_ACCESS_DUPLEX, //管道访问方式:PIPE_ACCESS_DUPLEX指双向模式
		PIPE_TYPE_MESSAGE | //命名管道句柄的写入方式:以数据块的方式写入管道
		PIPE_READMODE_MESSAGE | //命名管道句柄的读取方式:以数据块的方式从管道读取
		PIPE_WAIT, //命名管道句柄的等待方式:阻塞方式
		PIPE_UNLIMITED_INSTANCES, //管道所能创建的最大实例个数:1~255,
		0, //管道的输出缓冲区容量,0表示默认大小
		0, //管道的输入缓冲区容量,0表示默认大小 
		1000, //管道的默认等待超时,单位毫秒
		NULL); //管道的安全性,NULL表示windows提供的默认安全
	if (myHPipe == INVALID_HANDLE_VALUE)
	{
		return FALSE;
	}

	if (!ConnectNamedPipe(myHPipe, NULL))
	{
		return FALSE;
	}

	while (TRUE)
	{
		char wbuf[128];
		std::cout<<"*************Send Message**********************"<<std::endl;
		std::cin.getline(wbuf, 128);
		DWORD wr;
		if (!WriteFile(myHPipe, wbuf, 128, &wr, NULL))
		{
			std::cout<<"WriteFile"<<std::endl;
		}

		char rbuf[128];
		DWORD rs;
		if (!ReadFile(myHPipe, rbuf, 128, &rs, NULL))
		{
			std::cout<<"ReadFile"<<std::endl;
		}
		else
		{
			std::cout<<rbuf<<std::endl;
		}	

	}

	DisconnectNamedPipe(myHPipe);
	CloseHandle(myHPipe);
	return TRUE;
}

BOOL SemaphoreFun()
{
	myHSemaphore = CreateSemaphore(NULL, FALSE, TRUE, "MYSEM");
	if (myHSemaphore == NULL)
	{
		return FALSE;
	}

	std::cout<<"wait ReleaseSemaphore"<<std::endl;
	Sleep(10500);
	ReleaseSemaphore(myHSemaphore, 1, NULL);
	while(1)
	{
		std::cout<<"runing "<<std::endl;
		Sleep(500);
	}
	CloseHandle(myHSemaphore);
	return TRUE;
}

进程2测试代码如下:

#include <Windows.h>
#include <iostream>
/*********************1 共享内存**********************/
HANDLE myHMutex;
HANDLE myHEvent;
BOOL SharedMemoryFun();
/*********************2 命名管道**********************/
#define MY_PIPE_NAME "\\\\.\\pipe\\mypipe"
BOOL PipeFun();
/*********************3 信号量************************/
HANDLE myHSemaphore;
BOOL SemaphoreFun();
int main()
{
	/*if (SharedMemoryFun() == FALSE)
	{
	std::cout<<"SharedMemoryFun ERROR"<<std::endl;
	}*/

	/*if (PipeFun() == FALSE)
	{
		std::cout<<"PipeFun ERROR"<<std::endl;
	}*/

	if (SemaphoreFun() == FALSE)
	{
		std::cout<<"SemaphoreFun ERROR"<<std::endl;
	}
	system("pause");
	return 0;
}

BOOL SharedMemoryFun()
{
	//打开共享文件句柄
	HANDLE myhandle = OpenFileMapping(FILE_MAP_ALL_ACCESS,
		FALSE,
		"MYSM");//共享文件名称
	if (myhandle == NULL)
	{
		return FALSE;
	}

	//映射
	LPVOID lpbuf = MapViewOfFile(myhandle, 
		FILE_MAP_ALL_ACCESS,
		0,
		0,
		0);
	if (lpbuf == NULL)
	{
		return FALSE;
		CloseHandle(myhandle);
	}

	myHMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "MYMUTEX");
	if (myHMutex == NULL)
	{
		return FALSE;
	}

	myHEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, "MYEVENT");
	if (myHEvent == NULL)
	{
		return FALSE;
	}

	while(TRUE)
	{
		char buf[128];
		std::cout<<"************* Message**********************"<<std::endl;
		
		WaitForSingleObject(myHEvent, INFINITE);
		WaitForSingleObject(myHMutex, INFINITE);

		memcpy(buf, lpbuf, strlen(buf)+1);
		ReleaseMutex(myHMutex);
		if (buf[0] == 'q')
		{
			break;
		}

		/*if (buf[0] == '1')
		{
			for (int i = 0; i < 100; i++)
			{
				std::cout<<"*******************************"<<std::endl;
			}
		}*/
		std::cout<<buf<<std::endl;
	}


	CloseHandle(myHEvent);
	CloseHandle(myHMutex);

	UnmapViewOfFile(lpbuf);
	CloseHandle(myhandle);
	return TRUE;
}

BOOL PipeFun()
{
	if (!WaitNamedPipe(MY_PIPE_NAME, NMPWAIT_USE_DEFAULT_WAIT))
	{
		return FALSE;
	}

	HANDLE myHPipe = CreateFile(MY_PIPE_NAME,
		GENERIC_READ | //对象的访问方式:读访问
		GENERIC_WRITE, //对象的访问方式:写访问
		0, //对象是否共享:0表示不共享
		NULL, //指向一个SECURITY_ATTRIBUTES结构的指针
		OPEN_EXISTING, //对象的创建方式:OPEN_EXISTING表示打开对象(管道)
		FILE_ATTRIBUTE_NORMAL, //设置对象的属性和标志
		NULL);

	if (myHPipe == INVALID_HANDLE_VALUE)
	{
		return FALSE;
	}

	while (TRUE)
	{
		char rbuf[128];
		DWORD rs;
		if (!ReadFile(myHPipe, rbuf, 128, &rs, NULL))
		{
			std::cout<<"ReadFile"<<std::endl;
		}
		else
		{
			std::cout<<rbuf<<std::endl;
		}

		char wbuf[128];
		std::cout<<"*************Send Message**********************"<<std::endl;
		std::cin.getline(wbuf, 128);
		DWORD wr;
		if (!WriteFile(myHPipe, wbuf, 128, &wr, NULL))
		{
			std::cout<<"WriteFile"<<std::endl;
		}		

	}

	CloseHandle(myHPipe);
	return TRUE;
}

BOOL SemaphoreFun()
{

	myHSemaphore = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE,"MYSEM");
	if(myHSemaphore == NULL)
	{
		return FALSE;
	}
	std::cout<<"waiting "<<std::endl;

	WaitForSingleObject(myHSemaphore, INFINITE);

	std::cout<<"had waited "<<std::endl;
	CloseHandle(myHSemaphore);

	return TRUE;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值