IPC进程间通信+邮槽MailSlot
IPC(Inter-Process Communication。进程间通信)。
现代计算机採用虚拟内存机制,为进程提供独立的足够大的地址空间。处于安全目的,一个进程不具有特殊的权限。是无法訪问还有一个进程的内存空间,进程间相互隔绝。进程间通信IPC就须要特别的机制来实现。邮槽MailSlot是经常使用的IPC方法之中的一个。
1.邮槽(MailSlot):
邮槽MailSlot通信的进程分为服务端和client。服务端创建MailSlot,创建时指定邮槽名,client同过邮槽名打开MailSlot。
邮槽是单向的,服务端仅仅能读取MailSlot,client仅仅能写入MailSlot。服务端读取数据是先入先出,即先写入的数据先被读取。
2.邮槽命名
:
本机上格式:\.mailslot[path]name
如:\.mailslotmy_mailslot
3.基本API函数
:
创建邮槽:
HANDLE CreateMailSlot(
LPCTSTR lpName,
DWORD nMaxMessageSize,
DWORD lReadTimeout,
LPSECURITY_ATTRIBUTES lpSecurityAttributes
);
第一个參数:邮槽名。
第二个參数:最大消息长度。
第三个參数:读取超时,设为0时。没有消息马上返回。MAILSLOT_WAIT_FORVER时,一直等待消息。
第三个參数:安全属性,一般设为NULL。
该函数创建一个Mailslot。并返回该邮槽的句柄。
读取邮槽:
BOOL ReadFile(HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDOWRD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped)。
第一个參数:邮槽句柄。
第二个參数:缓存地址。
第三个參数:消息的长度。
第四个參数:实际读取的长度。
第五个參数:一般设置为NULL。
该函数用于读取邮槽内数据。
打开邮槽:
BOOL CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
第一个參数:文件指针。
第二个參数:訪问模式。
第三个參数:共享模式。
第四个參数:安全属性指针。
第五个參数:创建选项。
第六个參数:文件属性。
第七个參数:用于拷贝文件句柄。
该函数用于client打开Mailslot。
写入邮槽:
BOOL WriteFile(
HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped);
HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped);
第一个參数:文件句柄。
第二个參数:数据缓冲区指针。
第三个參数:写入字节数。
第四个參数:返回实际写入字节数。
第五个參数:结构体指针。一般置NULL。
该函数用于client向Mailslot写入数据。
4.牛刀小试 :
先在VC6.0中执行服务端程序,在执行client程序:
执行效果:
Mailslot服务端:
#include
#include
/* 全局变量 */
HANDLE hSlot;
//邮槽名
LPTSTR lpszSlotName = TEXT("\\.\mailslot\sample_mailslot");
void main()
{
DWORD cbRead;
char lpszBuffer[256]=" ";
//创建邮槽
hSlot = CreateMailslot(
lpszSlotName, // mailslot 名
0, // 不限制消息大小
MAILSLOT_WAIT_FOREVER, // 无超时
(LPSECURITY_ATTRIBUTES) NULL);
printf("Mailslot 创建成功!
");
while(1)
{
// 读取消息
ReadFile(hSlot, // mailslot句柄
lpszBuffer, // 缓存
256, // 消息的长度
&cbRead, // 实际读取的长度
NULL);
// 显示
printf("Data from the mailslot: %s
", lpszBuffer);
}
return ;
}
Mailslotclient:
#include
#include
/* 全局变量 */
HANDLE hSlot;
LPTSTR lpszSlotName = TEXT("\\.\mailslot\sample_mailslot"); // mailslot名
void main()
{
HANDLE hFile;
DWORD cbWritten;
char *send_data="I from client!";
// 打开mailslot
hFile = CreateFile(lpszSlotName,
GENERIC_WRITE, // 可写
FILE_SHARE_READ,
(LPSECURITY_ATTRIBUTES) NULL,
OPEN_EXISTING, // 打开一个已经存在的mailslot,应该由服务端已经创建
FILE_ATTRIBUTE_NORMAL,
(HANDLE) NULL);
// 向mailslot写入
WriteFile(hFile,
send_data,
(DWORD) (lstrlen(send_data)+1)*sizeof(TCHAR),
&cbWritten,
(LPOVERLAPPED) NULL);
// 结束
printf("Data written:%s
",send_data);
CloseHandle(hFile);
return ;
}