_ToBin 2015-02-03 10:35 采纳率: 0%
浏览 1684

【进程间通信】匿名管道问题,困扰已久,求各位帮忙指点一二

代码如下,这样是没有问题的,子进程收到hello child之后会返回信息。只是不知为什么 区域A 中的 问题代码 必须要在创建进程之前 关闭写句柄? 如果放到 CreateProcess之后 ,ReadFile就会一直卡在那,子进程估计没有返回,但这是为什么? 这个程序目前遇到的问题是区域A的信息成功写进去了,随后的句柄被关闭了,等子进程创建完毕后,再用区域B的WriteFile肯定是没办法写进去了,而区域C的ReadFile能读出来,但这样的话,我要是想在CreateProcess之后使用WriteFile怎么办呢?请各位指点指点!谢谢!


#include <windows.h>  
#include <stdio.h>  
#include "string.h"
int main(){
    char* path="./Debug/child.exe";
    HANDLE hChildRead,hFatherWrite,hChildWrite,hFatherRead;
    SECURITY_ATTRIBUTES safe={0};
    char szSendBuffer[256],szRecieveBuffer[256],*p=szRecieveBuffer;
    strcpy(szSendBuffer,"hello child");
    DWORD dwLen;
    safe.bInheritHandle=TRUE;
    safe.lpSecurityDescriptor=NULL;
    safe.nLength=sizeof(SECURITY_ATTRIBUTES);
    CreatePipe(&hChildRead,&hFatherWrite,&safe,0); //子进程1读管道
    CreatePipe(&hFatherRead,&hChildWrite,&safe,0); //子进程1写管道

//**********************************A区域*****************************************
    if(!WriteFile(hFatherWrite,szSendBuffer,strlen(szSendBuffer)+1,&dwLen,NULL))
    {
        puts("写管道失败!");
        exit(0);
    }
    puts("写管道成功!");
    CloseHandle(hFatherWrite);  //问题代码

//***********************************************************************************
    STARTUPINFO info={0};
    PROCESS_INFORMATION pro;
    GetStartupInfo(&info);
    info.cb=sizeof(STARTUPINFO);
    info.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
    info.wShowWindow=SW_HIDE;
    info.hStdInput=hChildRead;
    info.hStdOutput=hChildWrite;
    info.hStdError=hChildWrite;
    if(!CreateProcess(path,NULL,NULL,NULL,TRUE,NULL,NULL,NULL,&info,&pro))
    {
        puts("创建子进程失败!");
        exit(0);
    }
    CloseHandle(hFatherWrite);
    puts("进程创建成功!");
    CloseHandle(pro.hProcess); 
    CloseHandle(pro.hThread);
//************************************B区域******************************************
    if(!WriteFile(hFatherWrite,szSendBuffer,strlen(szSendBuffer)+1,&dwLen,NULL))
        {
            puts("写管道失败!");
            //exit(0);
        }
    else
    puts("写管道成功!");
//***********************************************************************************


//************************************C区域******************************************
    //CloseHandle(hFatherWrite);
    if(!ReadFile(hFatherRead,szRecieveBuffer,256,&dwLen,NULL))
    {
        puts("读管道失败!");
        exit(0);
    }
    *(p+dwLen)='\0';
    printf("%s\n",szRecieveBuffer);
//***********************************************************************************

    CloseHandle(hChildRead);
    CloseHandle(hChildWrite);
    CloseHandle(hFatherRead);
    return 0;
    }  
  • 写回答

1条回答

  • danielinbiti 2015-02-03 16:05
    关注

    WriteFile和ReadFile是阻塞的同步读写,不是异步。
    所以分三步进行, 这三步不能跌倒,每步是一个数据转移。
    1、写数据,因为同步,所以需要关闭
    2、创建进程,数据可以从输入转移到另一个进程的输出。
    3、在从中间的输出结果同步读取。
    所以三步是独立的,关键在于同步。如果不用匿名管道,就可以用Ex,那就是异步的了。

    评论

报告相同问题?

悬赏问题

  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥30 python代码,帮调试,帮帮忙吧