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

代码如下,这样是没有问题的,子进程收到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个回答

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

danielinbiti
danielinbiti 回复csjapan: c代码不熟悉,但按照我的理解,对readfile应该是一个while(true)的循环,一直处于监听
4 年多之前 回复
csjapan
_ToBin 能再具体一点吗,真的快疯了。。 现在子程序第一句是 puts, 父程序能够读取到子程序输出的第一条信息。子程序的第二局是gets,我把hStdInput绑定后,立马不能读取了,一直卡在那。。朋友能具体告诉我该如何改么?
4 年多之前 回复
csjapan
_ToBin z
4 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!