匿名管道

简介: 这种匿名管道,和读写文件类似。最好是一个进程读,一个进程写,适合单向通信,不适于双向通信,双向通信容易导致的问题是有可能,读到自己进程刚才写的内容。 纯手工代码,没有一丝拷贝 父进程代码: // PipeServer.cpp : 定义控制台应用程序的入口点。

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

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

父进程代码:

// 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;
}

 

相关文章
|
5月前
|
API 内存技术
无名管道&&有名管道详解代码
无名管道&&有名管道详解代码
|
6月前
|
Linux
【linux进程间通信(一)】匿名管道和命名管道
【linux进程间通信(一)】匿名管道和命名管道
|
6月前
|
消息中间件 安全 Unix
【进程通信】进程通信--匿名管道
【进程通信】进程通信--匿名管道
|
消息中间件 Unix Linux
Linux进程间通信【匿名管道和命名管道】
Linux进程间通信,包括匿名管道和命名管道的原理、操作及实现,两种管道实现进程池等丰富内容,详细讲解,干货满满!
267 2
Linux进程间通信【匿名管道和命名管道】
|
消息中间件 Unix Linux
进程间通信之管道(匿名管道与命名管道)
首先我们先提出一个问题:进程之间为什么无法直接通信,而需要操作系统提供通信方式: 经过我们上一个博客学习我们可以知道,每个进程都有独立的虚拟地址空间,一个进程在访问一个数据的时候都是通过地址来进行访问的,进过页表映射在之后访问物理内存,因此如果想要给另一个进程传递一个数据,就要把它的地址空间传递给其他进程,因为a进程的是虚拟地址,所以b进程经过页表映射也访问不了。(这个设计的初衷是:独立虚拟空间可以更稳定)
360 0
|
消息中间件 网络协议 BI
进程间通信---匿名管道
进程间通信---匿名管道
进程间通信---匿名管道
进程间通信:命名管道
一、命名管道(FIFO) 匿名管道应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。如果我们想在不相关的进程之间交换数据,可以使用FIFO文件来做这项工作,它经常被称为命名管道。 命名管道可以从命令行上创建,命令行方法是使用下面这个命令:$ mkfifo filename命名管道也可以从程序里创建,相关函数有:int mkfifo(const char *filename,mode_t mode);   二、命名管道和匿名管道 匿名管道由pipe函数创建并打开。
1036 0