zoukankan      html  css  js  c++  java
  • 【IPC进程间通讯之二】管道Pipe

    IPC进程间通信+管道Pipe

          
            IPC(Inter-Process Communication。进程间通信)。

            管道用于进程间共享数据,事实上质是共享内存。经常使用IPC之中的一个。

    管道不仅能够用于本机进程间通信,还可实现跨网络进程间通信。如同Socket通信。管道相同封装计算机底层网络实现,提供一个良好的API接口。

           
           1.管道(Pipe)

           管道分为匿名管道和命名管道。
           匿名管道仅仅能用于父子进程间通信 ,不能跨网络通信,而且通信是单向。

           命名管道可用于随意进程间通信。支持跨网络通信,而且通信是双向。随意一段都能够接收和发送数据。

    命名管道是学习的重点。

           命名管道通信进程分为服务端client,服务端创建Pipe,client通过管道名连接该Pipe之后。两方均可通过该Pipe发送和接收数据。
           
            2.邮槽命名 :
           本机上格式:\ServerNamePipe ame
           如:\.Pipemy_pipe

           3.基本API函数 :
    创建命名管道:
            HANDLE    CreateNamedPipe(
                            LPCTSTR   lpName,                // 指向管道名称的指针
                            DWORD     dwOpenMode,       // 管道打开模式
                            DWORD     dwPipeMode,       // 管道模式
                            DWORD     nMaxInstances,     // 最大实例数
                            DWORD     nOutBufferSize,   // 输出缓存大小
                            DWORD     nInBufferSize,       // 输入缓存大小
                            DWORD    nDefaultTimeOut, // 超时设置
    LPSECURITY_ATTRIBUTES lpSecurityAttributes   // 安全属性指针
    );
            该函数用于server端创建命名管道。
    等待client连接:
            BOOL  ConnectNamedPipe(
                         HANDLE    hNamedPipe,        //管道句柄
                         LPOVERLAPPED   lpOverlapped     //设为NULL
    ); 
            该函数用于server等待client连接到管道。

    检查命名管道:
            BOOL  WaitNamedPipe(
                         LPCTSTR   lpNamedPipeName,  //管道名
                         DWORD     nTimeOut                  //超时
    );
             该函数用于client检查是否存在管道Pipe。

    打开命名管道:
            BOOL  CreateFile(
                         LPCTSTR   lpFileName,
                         DWORD     dwDesiredAccess,
                         DWORD     dwShareMode,
                         LPSECURITY_ATTRIBUTES   lpSecurityAttributes,
                         DWORD    dwCreationDisposition,
                         DWORD    dwFlagsAndAttributes,
                        HANDLE    hTemplateFile
     
    );
             第一个參数:管道名指针。
             第二个參数:訪问模式。
             第三个參数:共享模式。
             第四个參数:安全属性指针。

             第五个參数:创建选项。
             第六个參数:文件属性。
             第七个參数:用于拷贝文件句柄。
             该函数用于打开一个管道。并返回管道句柄。
    读取管道:       
            BOOL ReadFile(
                        
    HANDLE    hFile,
                        LPVOID     lpBuffer,
                        DWORD    nNumberOfBytesToRead,
                        LPDOWRD    lpNumberOfBytesRead,
                        LPOVERLAPPED   lpOverlapped
    );
            第一个參数:管道句柄。
            第二个參数:缓存地址。

            第三个參数:消息的长度。
            第四个參数:实际读取的长度。

            第五个參数:一般设置为NULL。
            该函数用于读取管道内数据。
    写入管道:
            BOOL  WriteFile(
                         HANDLE    hFile,
                         LPCVOID   lpBuffer,
                         DWORD     nNumberOfBytesToWrite,
                         LPDWORD   lpNumberOfBytesWritten,
                         LPOVERLAPPED    lpOverlapped
    );
             第一个參数:管道句柄。

             第二个參数:数据缓冲区指针。
             第三个參数:写入字节数。
             第四个參数:返回实际写入字节数。
             第五个參数:结构体指针。一般置NULL。

             该函数用于client向管道写入数据。

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

             执行效果:

    server程序:
    client程序:




  • 相关阅读:
    .NET XmlNavigator with Namespace
    编程要素
    【FOJ】1962 新击鼓传花游戏
    【POJ】1389 Area of Simple Polygons
    【POJ】2482 Stars in Your Window
    【HDU】3265 Posters
    【HDU】1199 Color the Ball
    【HDU】3642 Get The Treasury
    【HDU】4027 Can you answer these queries?
    【HDU】1542 Atlantis
  • 原文地址:https://www.cnblogs.com/yfceshi/p/7352553.html
Copyright © 2011-2022 走看看