zoukankan      html  css  js  c++  java
  • 匿名管道

    这种匿名管道,和读写文件类似。最好是一个进程读,一个进程写,适合单向通信,不适于双向通信,双向通信容易导致的问题是有可能,读到自己进程刚才写的内容。

    纯手工代码,没有一丝拷贝

    父进程代码:

    // PipeServer.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <Windows.h>
    #include <iostream>
    using namespace std;
    #define BUFF_SIZE 1024
    
    
    
    void Test()
    {
        SECURITY_ATTRIBUTES sec_handle = {0};
        sec_handle.bInheritHandle = TRUE;
        sec_handle.lpSecurityDescriptor = NULL;
        sec_handle.nLength = sizeof(sec_handle);
    
        HANDLE hReadPipe = INVALID_HANDLE_VALUE;
        HANDLE hWritePipe = INVALID_HANDLE_VALUE;
        BOOL bCrtPipeOk = CreatePipe(&hReadPipe,&hWritePipe,&sec_handle,BUFF_SIZE);
        if(!bCrtPipeOk) return ;
    
        STARTUPINFO siStartInfo;
        ZeroMemory( &siStartInfo, sizeof(STARTUPINFO) );
        siStartInfo.cb = sizeof(STARTUPINFO); 
    
         PROCESS_INFORMATION piProcInfo; 
         ZeroMemory( &piProcInfo, sizeof(PROCESS_INFORMATION) );
    
         TCHAR szCommandLine[256] = {0};
         _stprintf_s(szCommandLine,_T("-hReadPipe %d -hWritePipe %d"),hReadPipe,hWritePipe);
    
          if(!::CreateProcess(
            _T("PipeClient.exe"),
            szCommandLine,
            NULL,
            NULL,
            TRUE,
            0 | CREATE_NEW_CONSOLE,
            NULL,
            NULL,
            &siStartInfo,
            &piProcInfo))
          {
              int nError = ::GetLastError();
              cout<<"创建进程失败:"<<nError<<endl;
              return;
          }
    
    
        while(1)
        {
            char szReadBuf[BUFF_SIZE] = {0};
            cout<<"Server Reading....."<<endl;
            DWORD dwReaded = 0;
            BOOL bRead = ::ReadFile(hReadPipe,szReadBuf,BUFF_SIZE,&dwReaded,NULL);
            if(!bRead)
                cout<<"ReadFile Error: "<<::GetLastError()<<endl;
            else
                wcout<<L"Readed content:"<<szReadBuf<<endl;
    
    
            cout<<"Server Writeing ... "<<endl;
            char szWrite[] = {"I'm Server"};
            DWORD dwWritten = 0;
            if(!::WriteFile(hWritePipe,szWrite,
                sizeof(szWrite),
                &dwWritten,
                NULL))
            {
                cout<<"Server Write Error:"<<::GetLastError()<<endl;
            }
            else
                cout<<"ServerWrite Ok!!!"<<endl;
    
    
            Sleep(1000);
        }
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
        Test();
        system("pause");
        return 0;
    }

    子进程  代码 

    // PipeClient.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <iostream>
    #include <Windows.h>
    using namespace std;
    
    void Test(HANDLE hRead,HANDLE hWrite)
    {
        char szWrite[] = ("I'm Client!!");
        DWORD dwWritten = 0;
        cout<<"client now Write...."<<endl;
        if(!::WriteFile(hWrite,
            szWrite,
            sizeof(szWrite),
            &dwWritten,
            NULL))
        {
            int nError = ::GetLastError();
            cout<<"写文件出错:"<<nError<<endl;
            return ;
        }
    
    
        cout<<"client write finished"<<endl;
        char szRead[256] = {0};
        DWORD dwReaded = 0;
        cout<<"client start read......"<<endl;
        if(!ReadFile(hRead,szRead,sizeof(szRead),&dwReaded,NULL))
        {
            int nError = ::GetLastError();
            cout<<"读文件出错:"<<nError<<endl;
            return ;
        }
        else
            cout<<"client read:"<<szRead<<endl;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        
        if(argc <= 1)
            return 0;
    
    
        HANDLE hReadPipe = (HANDLE) _tstoi(argv[1]);
        HANDLE hWritePipe = (HANDLE)  _tstoi(argv[3]);
        //DebugBreak();
        Test(hReadPipe,hWritePipe);
        system("pause");
        return 0;
    }
  • 相关阅读:
    Asp.net获取客户端的IP地址排除::1
    EF 筛选列包含NULL会报错
    layUI关于table编辑列支持方向键功能
    .NET CORE 发布IIS问题收集
    VS2019最新源代码管理工具+附下载地址
    关于Mysql可视化工具Navicat Premium12激活使用【亲测】
    经典SQL 语句
    事务的四种隔离级别 [转载]
    HTML 特殊符号编码对照表
    github本地文件Push到仓库
  • 原文地址:https://www.cnblogs.com/zhangdongsheng/p/4656147.html
Copyright © 2011-2022 走看看