命名管道FIFO

在进程间通讯时使用了命名管道,在这里做个记录。开始想使用共享内存,但是由于两个进程数据通讯速度快数据量大,担心共享内存会存满或者覆盖数据。因此就使用了管道。
管道的命令格式 “\.\pipe\管道名”
服务端:
1、创建命名管道:

m_hHandle = CreateNamedPipe(A2T(m_szFifoName),
			PIPE_ACCESS_DUPLEX,
			PIPE_TYPE_BYTE | PIPE_WAIT,
			PIPE_UNLIMITED_INSTANCES,
			m_nOutSize,
			m_nInSize,
			0,
			NULL
		);
		if (m_hHandle == INVALID_HANDLE_VALUE)
		{
		}

第三个参数管道模式,标识数据以什么形式写入管道和对管道的的等待模式。
2、等待连接:

if (ConnectNamedPipe(m_hHandle, NULL) == 0)
	{
	}

在这一步由于第一步设置了管道是PIPE_WAIT阻塞模式,因此程序执行到这会阻塞,直到有客户端连接进来。
客户端:
1、检测管道是否可以用:

if (WaitNamedPipe(A2T(szBuffer), NMPWAIT_WAIT_FOREVER) == 0)
{
}

2、当检测到该命名管道可用就打开管道

m_hHandle = CreateFile(A2T(szBuffer),
		GENERIC_WRITE | GENERIC_READ,
		0,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,
		NULL);
	if (m_hHandle == INVALID_HANDLE_VALUE)
	{
		return false;
	}

注意打开的是已存在的管道,因此第5个参数是OPEN_EXISTING代表打开已存在的意思。
到这一步打开成功后服务端的第2步就结束阻塞继续执行。
下面就是读写管道。

BOOL
WINAPI
ReadFile(
    _In_ HANDLE hFile,
    _Out_writes_bytes_to_opt_(nNumberOfBytesToRead, *lpNumberOfBytesRead) __out_data_source(FILE) LPVOID lpBuffer,
    _In_ DWORD nNumberOfBytesToRead,
    _Out_opt_ LPDWORD lpNumberOfBytesRead,
    _Inout_opt_ LPOVERLAPPED lpOverlapped
    );
BOOL
WINAPI
WriteFile(
    _In_ HANDLE hFile,
    _In_reads_bytes_opt_(nNumberOfBytesToWrite) LPCVOID lpBuffer,
    _In_ DWORD nNumberOfBytesToWrite,
    _Out_opt_ LPDWORD lpNumberOfBytesWritten,
    _Inout_opt_ LPOVERLAPPED lpOverlapped
    );

ReadFile():
1、当管道中没有数据时,该函数会阻塞。
2、当管道另一端关闭,该函数会立即返回0。
WriteFile():
1、当管道中内存已经占满,该函数会阻塞,另一端读出后空出空间才会解除该函数阻塞状态。
2、但管道另一端关闭,该函数返回0。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值