IPC进程间通信+邮槽MailSlot

      
        IPC(Inter-Process Communication。进程间通信)。
       现代计算机採用虚拟内存机制,为进程提供独立的足够大的地址空间。处于安全目的,一个进程不具有特殊的权限。是无法訪问还有一个进程的内存空间,进程间相互隔绝。进程间通信IPC就须要特别的机制来实现。邮槽MailSlot是经常使用的IPC方法之中的一个。

        
       1.邮槽(MailSlot):
        
       邮槽MailSlot通信的进程分为服务端client。服务端创建MailSlot,创建时指定邮槽名,client同过邮槽名打开MailSlot。
       邮槽是单向的,服务端仅仅能读取MailSlot,client仅仅能写入MailSlot。服务端读取数据是先入先出,即先写入的数据先被读取。


        2.邮槽命名
:
        本机上格式:\\.\mailslot\[path\]name
        如:\\.mailslot\my_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

);
         第一个參数:文件指针。
         第二个參数:訪问模式。
         第三个參数:共享模式。

         第四个參数:安全属性指针。
         第五个參数:创建选项。
         第六个參数:文件属性。
         第七个參数:用于拷贝文件句柄。
         该函数用于client打开Mailslot。
写入邮槽:
        BOOL  WriteFile(
                     HANDLE    hFile,
                     LPCVOID   lpBuffer,
                     DWORD     nNumberOfBytesToWrite,
                     LPDWORD   lpNumberOfBytesWritten,
                     LPOVERLAPPED    lpOverlapped);
         第一个參数:文件句柄。
         第二个參数:数据缓冲区指针。

         第三个參数:写入字节数。

         第四个參数:返回实际写入字节数。

         第五个參数:结构体指针。一般置NULL。

         该函数用于client向Mailslot写入数据。

         4.牛刀小试 : 
         先在VC6.0中执行服务端程序,在执行client程序:
        执行效果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbG92ZWNvZGVsZXNz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

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 创建成功!\n"); while(1)
{ // 读取消息
ReadFile(hSlot, // mailslot句柄
lpszBuffer, // 缓存
256, // 消息的长度
&cbRead, // 实际读取的长度
NULL); // 显示
printf("Data from the mailslot: %s\n", 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\n",send_data);
CloseHandle(hFile);
return ;
}

【IPC进程间通讯之中的一个】邮槽MailSlot的更多相关文章

  1. 守护进程,进程安全,IPC进程间通讯,生产者消费者模型

    1.守护进程(了解)2.进程安全(*****) 互斥锁 抢票案例3.IPC进程间通讯 manager queue(*****)4.生产者消费者模型 守护进程 指的也是一个进程,可以守护着另一个进程 一 ...

  2. 【IPC进程间通讯之二】管道Pipe

    IPC进程间通信+管道Pipe                IPC(Inter-Process Communication.进程间通信).         管道用于进程间共享数据,事实上质是共享内存 ...

  3. ipc 进程间通讯的AIDL

    1.什么是aidl:aidl是 Android Interface definition language的缩写,一看就明白,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间 ...

  4. android IPC 进程间通讯

    参考资料: http://blog.csdn.net/birdsaction/article/details/39451849 在这里我说一下学习技术的方法,别人的博客,别人的东西,再简单,自己没有写 ...

  5. 【IPC进程间通讯之三】内存映射文件Mapping File

    IPC进程间通信+共享内存Mapping                IPC(Inter-Process Communication.进程间通信).         文件映射(Mapping)是一种 ...

  6. Android AIDL 进行进程间通讯(IPC)

    编写AIDL文件时,需要注意: 1.接口名和aidl文件名相同. 2.接口和方法前不用加访问权限修饰符 (public.private.protected等,也不能用final.static). 3. ...

  7. Android进阶笔记04:Android进程间通讯(IPC)之Messenger

    一. Android进程间通讯之Messenger 的引入 (1)引言:      平时一说进程间通讯,大家都会想到AIDL,其实messenger和AIDL作用一样,都可以进行进程间通讯.它是基于消 ...

  8. c#进程间通讯方案之IPC通道

    转载:http://www.cnphp.info/csharp-ipc-channel-remoting.html 最近一直纠结与使用多进程还是多线程来构建程序.多线程的方法似乎不错,但是一个进程可承 ...

  9. Android(java)学习笔记232:Android进程间通讯(IPC)之AIDL

    一.IPC inter process communication  进程间通讯 二.AIDL android  interface  defination  language  安卓接口定义语言 满 ...

随机推荐

  1. asp.net防止刷新时重复提交

    前段时间遇到了需要禁用刷新的需求,f5按钮就不说了,简单的js就能把它禁用,但是工具条上的刷新按钮却傻傻干不掉. 如果简单的在刷新时重新加载画面,通过window.location.href=&quo ...

  2. JavaScript中的两个“0”(翻译)

    本文翻译自JavaScript’s two zeros JavaScript has two zeros: −0 and +0. This post explains why that is and ...

  3. hdu 2612:Find a way(经典BFS广搜题)

    Find a way Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  4. superresolution_v_2.0 Application超分辨率程序文档

    SUPERRESOLUTION GRAPHICAL USER INTERFACE DOCUMENTATION Contents 1.- How to use this application. 2.- ...

  5. VC++ 监视文件(夹)

    参考:http://www.cnblogs.com/fangkm/archive/2009/03/31/1426526.html WinFileSystemMonitor.h  C++ Code  1 ...

  6. Matplotlib植入PyQt5 + QT5的UI呈现

    实现matplotlib图形通过PyQt5+Qt5在GUI中呈现步骤: 第一步,通过matplotlib.backends.backend_qt5agg类来连接PyQt5: import matplo ...

  7. windows安装oracle11g第二部

    Oracle 11g数据库安装及配置 安装Oracle数据库: 1)压缩包解压,双击运行win64_11gR2_database\database\setup.exe 2)输入电子邮件,点击“下一步” ...

  8. <span>和<div>标签的隐藏和显示切换

    <div class="axb"> <span id="tipStep1" class="fl" >第一步显示< ...

  9. [LintCode] 寻找缺失的数

    class Solution { public: /** * @param nums: a vector of integers * @return: an integer */ int findMi ...

  10. Yii2 Model的一些常用rules规则,使用Validator验证

    1. Yii2里 model在使用load方法加载浏览器的值的时候,会进行rules验证.这时候可以使用场景,让model对不同场景使用不同验证方式 2. 可以用attributeLabels()来指 ...