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

    匿名管道

    父进程

    #include<windows.h>
    #include<stdio.h>
    main()
    {
     HANDLE read=NULL,write=NULL;//定义两句柄
     SECURITY_ATTRIBUTES ss; 
     STARTUPINFO sa={0}; 
     PROCESS_INFORMATION pp={0};      //定义结构体SECURITY_ATTRIBUTES变量
     char text[]="匿名管道程序测试!";
     DWORD writetext;
    ss.nLength=sizeof(ss);       //填充结构体中的各成员
    ss.lpSecurityDescriptor=NULL;
    ss.bInheritHandle=TRUE;
    if(CreatePipe(&read,&write,&ss,0))     //创建匿名管道
    {
       printf("创建匿名管道成功 ");        //定义并初始化结构体
    sa.cb=sizeof(sa);          //填充结构体中的各个成员
    sa.dwFlags=STARTF_USESHOWWINDOW;
    sa. hStdInput=read;
    sa. hStdOutput=write;
    sa. hStdError= GetStdHandle(STD_ERROR_HANDLE);
    sa.wShowWindow=SW_MAXIMIZE;
    if(::CreateProcess(NULL,"子进程.exe",NULL,NULL,TRUE,0,NULL,NULL,&sa,&pp))
    {
     printf("创建子进程成功 ");
     WriteFile(write,text,sizeof(text),&writetext,NULL);
    printf("通过匿名管道写入数据成功 ");
    }
    else
    {
    printf("创建子进程失败 ");
      }
     }
    }

    子进程

    #include<windows.h>
    #include<stdio.h>
    main()
    {
     HANDLE read=NULL;
     char text[100];//="匿名管道程序测试!";
     DWORD readtext;
     read=GetStdHandle(STD_INPUT_HANDLE);
    if(ReadFile(read,text,100,&readtext,NULL)==0)
    {
     printf("从匿名管道中读取的数据是:%s ",text);
    }
    Sleep(10000);
    return 0;
    }

    命名管道

    服务器

    #include<windows.h>
    #include<stdio.h>
    main()
    {
     HANDLE hpip;
     OVERLAPPED ovi={0}; 
      char buf[200];           //定义数据缓冲区
     DWORD readbuf; 
     hpip=CreateNamedPipe("\\.\pipe\pipename", PIPE_ACCESS_DUPLEX,
                         PIPE_TYPE_BYTE, PIPE_UNLIMITED_INSTANCES,1024,1024,0,NULL);        //定义结构体变量
    printf("创建管道成功,正在等待客户端连接! ");
    if(::ConnectNamedPipe(hpip,&ovi))
    {       //等待客户端的连接请求     {
      printf("客户端连接成功! ");
      printf("正在读取数据! ");//提示信息         //获取实际读取字节数
    if(ReadFile(hpip,buf,200,&readbuf,NULL))     //读取管道数据
    {
      printf("数据读取成功 ");//提示信息
      printf("读取到的数据是:%s ",buf);
      }
    else
    {
      printf("数据读取失败 ");
      }
    }                             //创建命名管
    }


    客户端

    #include<windows.h>
    #include<stdio.h>
    main()
    {
     HANDLE hpip;
     OVERLAPPED ovi={0}; 
      char buf[]="命名管道测试程序";           //定义数据缓冲区
     DWORD readbuf;        //定义结构体变量
    printf("正在连接命名管道! ");
    if(WaitNamedPipe("\\.\pipe\pipename", NMPWAIT_WAIT_FOREVER))  //连接命名管道
    {
      hpip=CreateFile("\\.\pipe\pipename", GENERIC_READ| GENERIC_WRITE,0,
                 NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL); //打开指定命名管道
       if(hpip==INVALID_HANDLE_VALUE)
       {
        printf("打开命名管道失败 ");
       }
       else
       {         //获取实际读取字节数
    if(WriteFile(hpip,buf,sizeof(buf),&readbuf,NULL))    //写入数据到管道
    {
      printf("数据写入成功 ");       //提示信息
      }
    else
    {
      printf("数据写入失败 ");
      }
       }
     }
    else
    {
       printf("连接命名管道失败 ");         //提示信息
      }                             //创建命名管
    }

  • 相关阅读:
    pycharm过期后,修改hosts文件?
    三种格式化方式
    virtualenv安装及使用
    二分查找以及单例模式
    目录总览
    SQLAlchemy
    Redis
    linux 安装虚拟机
    shell基本命令
    Linux 命令大全
  • 原文地址:https://www.cnblogs.com/duyy/p/3734724.html
Copyright © 2011-2022 走看看