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. java定时调度器解决方案分类及特性介绍

    什么是定时调度器? 我们知道程序的运行要么是由事件触发的,而这种事件的触发源头往往是用户通过ui交互操作层层传递过来的:但是我们知道还有另外一种由机器系统时间触发的程序运行场景.大家想想是否遇到或者听 ...

  2. Bus error (core dumped) 我重启了下superviser 资源cpu占用高

    python policy.py Bus error (core dumped) 我重启了下superviser

  3. js生成唯一的uuid

    ---恢复内容开始--- 在做项目的时候出现这样的一种情况,需要动态生成唯一的uuid,刚开始我的思路是这样的,我可以根据时间来做,然后出现了下面的思路: var uuid = "cms&q ...

  4. 除去Scala的糖衣(13) -- Default Parameter Value

    欢迎关注我的新博客地址:http://cuipengfei.me/ 好久没有写博客了,上一次更新竟然是一月份. 说工作忙都是借口,咋有空看美剧呢. 这半年荒废掉博客说到底就是懒,惯性的懒惰.写博客这事 ...

  5. 经验总结20--C#模拟WEB请求

    非常多语言能够使用代码进行WEB请求,获取到须要的数据. 方便调用别人的接口,自己进行处理. HttpWebRequest request = WebRequest.Create(url) as Ht ...

  6. 使用async/await——Nodejs+ExpressJs+Babel

    在使用诸如restify/expressjs等Nodejs Web Framework时,我们最头疼的问题就是回调黑洞. 虽然后又Koa/Koa2号称“The Next Framework”使用co解 ...

  7. js原型链和继承

    在了解js原型链之前构造函数.原型对象.对象实例这几种概念必须要明白. 1. 创建对象有几种方法 //原型链指向objectvar o1={name:'o1'}; var o11=new Object ...

  8. 初级Java面试题 - JavaSE篇

    p{font-size:18px;} li{font-size:18px;} 加入我的QQ群(701974765) 获取更多好用又好玩的软件,还有不定期发放的福利呦(- ̄▽ ̄)- Java基本数据类型 ...

  9. Code Forces 650 C Table Compression(并查集)

    C. Table Compression time limit per test4 seconds memory limit per test256 megabytes inputstandard i ...

  10. Oracle Schema Objects——Tables——TableStorage

    Oracle Schema Objects Table Storage Oracle数据库如何保存表数据? Oracle Database uses a data segment in a table ...