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

_ToBin 2015-02-03 08:50:41
代码如下,这样是没有问题的,子进程收到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;
}
...全文
181 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
信阳毛尖 2015-02-05
  • 打赏
  • 举报
回复
我不知道你为嘛要crete两组pipe?一组就够了呀!

HANDLE hPipeRead = NULL;
HANDLE hPipeWrite = NULL;

SECURITY_ATTRIBUTES sa = {0}; 
sa.bInheritHandle=TRUE;
sa.lpSecurityDescriptor=NULL;
sa.nLength=sizeof(SECURITY_ATTRIBUTES); 
if(!CreatePipe(&hPipeRead,&hPipeWrite,&sa,0))
{
	MessageBox("创建匿名管道失败!");       //传进管道失败的话,返回值是0
	return;
}

STARTUPINFO info = {0};
PROCESS_INFORMATION pro = {0};
GetStartupInfo(&info);
info.cb=sizeof(STARTUPINFO);
info.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
info.wShowWindow=SW_HIDE;
info.hStdInput=hPipeRead;					//将结构体的标准输入句柄设置为管道的读取句柄
info.hStdOutput=hPipeWrite;					//将结构体的标准输出句柄设置为管道的写入句柄
info.hStdError=GetStdHandle(STD_ERROR_HANDLE);
 if(!CreateProcess(path,NULL,NULL,NULL,TRUE,NULL,NULL,NULL,&info,&pro))
{
        puts("创建子进程失败!");
        exit(0);
}
在主程序退出之前closehandle hPipeRead、hPipeWrite
Sandrer 2015-02-04
  • 打赏
  • 举报
回复
用文件映射来做吧,同一台电脑的操作系统中的所有通讯底层都最终都是调用文件映射的 无论管道还是文件映射,需要在进程间通讯的话,都必须“命名” 无论读或写,如果没有一个统一的名称,谁知道会读到哪里去了

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧