首先放一张程序的运行图(程序下载地址),这里是父进程的一个命令行执行情况:

父进程的源文档中已经将子进程的执行程序放在了相对路径下,各位下载后直接运行父进程进行Debug即可得到效果,子进程程序供学习参考使用,这里先放上父进程的代码:

int main(int argc, char* argv[])
{
 
    SECURITY_ATTRIBUTES sa;  //定义一个安全结构体类型的变量Sa
    sa.bInheritHandle = TRUE;//让子进程可以继承父进程创建的匿名管道的读写句柄
    sa.lpSecurityDescriptor = NULL;//让系统为创建的匿名管道赋予默认的安全描述符
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);//得到结构体(SECURITY_ATTRIBUTES)的长度
    if (!CreatePipe(&hRead, &hWrite, &sa, 0))//判断创建匿名管道是否成功
    {
        cout << "创建匿名管道失败!\n";
        return 0;
    }
    else
        cout << "成功创建匿名管道!\n";
    //如果创建匿名管道成功,就启动子进程,并将匿名管道的读写句柄传递给子进程
    STARTUPINFO sui;//创建子进程的函数需要的一个结构体类型的值
    PROCESS_INFORMATION pi;
    ZeroMemory(&sui, sizeof(STARTUPINFO));//将其余的成员全部置零,避免造成不好的影响
    sui.cb = sizeof(STARTUPINFO);//cb用来存放结构体变量STARTUPINFO的长度
    sui.dwFlags = STARTF_USESTDHANDLES;//标志成员,表示当前STARTUPINFO结构体的标准输入,标准输出和标准错误句柄有用
    sui.hStdInput = hRead;
    sui.hStdOutput = hWrite;//将子进程的标准输入输出句柄分别设置为管道的读、写句柄
    sui.hStdError = GetStdHandle(STD_ERROR_HANDLE);
    sui.wShowWindow = SW_SHOW; //隐藏命令行窗口
    sui.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
    WriteMsg();
    if (!CreateProcess(NULL, "child.exe", NULL, NULL,
        TRUE, 0, NULL, NULL, &sui, &pi))//创建子进程(十个参数)
    {
        CloseHandle(hRead);
        CloseHandle(hWrite);//关闭句柄,将内核对象的使用计数减少1,这样当操作系统发现内核对象的使用计数为0时,将清除内核对象。
        hRead = NULL;
        hWrite = NULL;
        cout << "创建子进程失败!";
        return 0;
    }
    else
    {
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);
    }
 
 
    Sleep(200);
    ReadMsg();
    return 0;
}
在说明创建函数之前我们需要先了解程序代码中涉及的几个结构体具体是干什么的(详细请查询库)

STARTUPINFO:用于指定新进程的主窗口特性的一个结构。
SECURITY_ATTRIBUTES:一个与安全相关的结构体。
PROCESS_INFORMATION:在创建进程时相关的数据结构之一,该结构返回有关新进程及其主线程的信息。
其余的代码的具体含义已经给予了非常详细的注释,这里只单说一下Create函数的各个参数的具体含义

CreateProcess("child.exe", NULL, NULL, NULL,TRUE, 0, NULL, NULL, &sui, &pi)
这里一共有十个参数
1、子进程应用程序的进程名
2、指定命令行参数,默认为NULL
3|4、进程和线程安全属性,默认为NULL,即使用系统默认安全属性
5、值为TRUE时,让父进程的每个可继承的打开句柄都能被子进程继承
6、创建标志,如不需要,置值为0
7、让新进程使用调用进程的环境、默认为NULL
8、让父进程和子进程拥有同样的驱动器和路径,默认为NULL
9、STARTUPINFO结构体实例化对象的地址(sui地址)
10、PROCESS_INFORMATION的地址(pi地址)
读数据代码:

void ReadMsg()
{
    char buf1[512];
    DWORD dwRead;
    if (!ReadFile(hRead, buf1, 512, &dwRead, NULL))
    {
        cout<<"读取数据失败!";
        return;
    }
    else
    {
        cout << "管道中读取数据为:"<<buf1;
        system("pause");
    }
}
写数据代码:

void WriteMsg()
{
    char buf[100];
    cout << "请输入你要发给子进程的消息:\n";
    cin >> buf;
    DWORD dwWrite;
    if (!WriteFile(hWrite, buf, strlen(buf), &dwWrite, NULL))
    {
        cout << "写入数据失败!";
        return;
    }
    else
        cout << "成功写入数据!\n";
}
相对于父进程,子进程相应就要简单很多了:

子进程读信息:

void ReadMsg()
{
 
    DWORD dwRead;
    if (!ReadFile(hRead, buf, 100, &dwRead, NULL))
    {
        cout<<"读取数据失败!";
        return;
    }
    sprintf(buf1, "子进程返回的数据为 %s!\n", buf);
    return;
}
子进程写信息:

void WriteMsg()
{
    DWORD dwWrite;
    if (!WriteFile(hWrite, buf1, strlen(buf1) + 1, &dwWrite, NULL))
    {
        cout << "写入数据失败!";
        return;
    }
 
}
子进程的主函数:

int main(int argc, char* argv[])
{
    hRead = GetStdHandle(STD_INPUT_HANDLE);//用于从一个特定的标准设备(标准输入、标准输出或标准错误)中取得一个句柄(用来标识不同设备的数值)
    hWrite = GetStdHandle(STD_OUTPUT_HANDLE);
    ReadMsg();
    Sleep(200);
    WriteMsg();
    return 0;
}

---------------------

原文:https://blog.csdn.net/qq_15029743/article/details/79492645

C++匿名管道详解及简单案例(基于VS2013)相关推荐

  1. C++命名管道详解及简单案例(基于VS2013)

    在介绍命名管道之前首先要区分匿名管与命名管道的区别: 1.匿名管道只能在本地的机器上的父子进程间通信 2.命名管道不仅可以在本机上实现两个进程间的通信,还可以跨网络实现两个进程间的通信 好了先上一下程 ...

  2. 操作系统之银行家算法—详解流程及案例数据

    操作系统之进程调度--优先权法和轮转法(附上样例讲解) 操作系统之银行家算法-详解流程及案例数据 操作系统之多线程编程-读者优先/写者优先详解 操作系统之存储管理--FIFO算法和LRU算法 操作系统 ...

  3. 《Unity 3D 游戏开发技术详解与典型案例》——1.3节第一个Unity 3D程序

    本节书摘来自异步社区<Unity 3D 游戏开发技术详解与典型案例>一书中的第1章,第1.3节第一个Unity 3D程序,作者 吴亚峰 , 于复兴,更多章节内容可以访问云栖社区" ...

  4. 匿名函数python_基于python内置函数与匿名函数详解

    内置函数 Built-in Functions abs() dict() help() min() setattr() all() dir() hex() next() slice() any() d ...

  5. JavaWeb中filter的详解及应用案例

    JavaWeb中filter的详解及应用案例 转载自:http://www.cnblogs.com/vanl/p/5742501.html 一:Filter介绍 Filter可认为是Servlet的一 ...

  6. Android 3D游戏开发技术详解与典型案例

    下载地址 <Android3D游戏开发技术详解与典型案例>主要以Android平台下3D游戏的开发为主题,并结合真实的案例向读者详细介绍了OpenGL ES的基础 知识及3D游戏程序开发的 ...

  7. 《Unity 3D 游戏开发技术详解与典型案例》——1.1节Unity 3D基础知识概览

    本节书摘来自异步社区<Unity 3D 游戏开发技术详解与典型案例>一书中的第1章,第1.1节Unity 3D基础知识概览,作者 吴亚峰 , 于复兴,更多章节内容可以访问云栖社区" ...

  8. 组合模式详解附有代码案例分析(包含透明组合模式、安全组合模式的代码示例)

    组合模式 一.组合模式的概念和角色 (一).组合模式的概念 (二).组合模式的角色 二.组合模式的应用场景 三.透明组合模式的代码示例 四.安全组合模式的代码示例 五.组合模式的优缺点 (一).优点 ...

  9. 模板方法模式详解附有代码案例分析(包含模板方法模式重构JDBC操作业务代码示例)

    模板方法模式 一.模板方法模式的概念和角色 (一).模板方法模式的概念 (二).模板方法模式的角色 二.模板方法模式的应用场景 三. 模板方法模式的代码示例 四.模板方法模式重构JDBC操作业务 五. ...

最新文章

  1. T-SQL Convert转换时间类型
  2. 数据告诉你,胡歌的微世界
  3. 深度学习代码注解(一)—— mnistdeepauto
  4. modelsim显示状态机名称的方法
  5. 吕玉琴考研指导电子版_【干货大放送】中国历代文学作品选阅读指导PDF
  6. [转]在ROS下使用zeroconf配置多机通信
  7. 计数后打印垂直柱状图(洛谷P1598题题解,Java语言描述)
  8. Java中HashMap和TreeMap的区别深入理解
  9. ansible+packer+terraform在aws上布署web服务器
  10. 什么是持续集成(CI)/持续部署(CD)?
  11. 获取MOSS页面中控件使用的样式(转)
  12. JavaWbe中文乱码解决方案
  13. JS Array转JSON
  14. 分治法求数组最大最小数
  15. OpenCV入门到进阶:实战三大典型项目(更新至12) IT自学视频教程
  16. imx6ull-qemu 裸机教程1:GPIO,IOMUX,I2C
  17. php 413,PHPCMS上传错误413?
  18. 鸿蒙系统 google应用
  19. 7款相见恨晚的资源网站,每个都百里挑一,送给正需要的你!
  20. C语言每日一练 —— 第20天:位运算

热门文章

  1. 如何使用facenet详解_如何使用冰箱更节能 使用冰箱节能技巧介绍【详解】
  2. IntelliJ IDEA开发工具安装Scala插件使用
  3. 图像锐化——基于梯度算子的五种方法
  4. 基于主成分分析法的综合评价模型及matlab实现
  5. java edittext 输入监听_Android应用开发之Android EditText 监听用户输入完成的实例
  6. 计算机网络子网划分路由配置实验报告,洛阳理工学院+计算机网络+实验5子网划分路由配置...
  7. 查看家庭组组计算机用户名密码是什么,windows10系统如何查看家庭组密码
  8. 干货总结:I2C总线详细要点
  9. 做技术的,聊聊研发。
  10. 骚操作!用铁丝做“电路”,不服不行!