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

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

代码如下,这样是没有问题的,子进程收到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 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀