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程序:




  • 相关阅读:
    WEB环境安装步骤v1.2
    将m3u8格式转成mp4格式
    MySQL简介及安装v0.1
    使用脚本pull阿里云的k8s镜像并更改标签
    常用脚本
    常用命令
    记录一下环境变量IFS特定场景使用技巧
    hp-unix创建和更改LV
    HP-UNIX常用命令
    Linux集群搭建
  • 原文地址:https://www.cnblogs.com/yfceshi/p/7352553.html
Copyright © 2011-2022 走看看