求助!匿名管道交互通信问题

surmount 2013-12-03 04:00:49
利用匿名管道实现父子进程之间的通信
A进程创建两个管道,创建一个进程B
两个管道分别为读取B的结果和向B传输命令

遇到如下问题:
A成功创建B后,读取到B的执行结果,判断结果,根据结果数据来决定下一步传输的命令。
但是在读取结果后,第一次传输命令成功,但是第二次传输命令时,readfile读取不到数据。请大拿解释下。

sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;

//这个管道用于主程序向子进程传递命令
if (!CreatePipe(&hMainRead,&hMainWrite,&sa,0))
{
printf("CreatePipe Failed!\n");
return 0;
}

//这个管道用于子进程向主程序传递结果
if (!CreatePipe(&hCmdRead,&hCmdWrite,&sa,0))
{
printf("CreatePipe Failed!\n");
return 0;
}


ZeroMemory(&si,sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hCmdWrite;
si.hStdOutput = hCmdWrite;
si.hStdInput = hMainRead;
si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));

if (!CreateProcess(NULL,szCmd,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
{
printf("CreateProcess Failed!\n");
return 0;
}

// CloseHandle(hMainRead);
// CloseHandle(hCmdWrite);

while (TRUE)
{
memset(szReadBuff,0,MAX_SIZE);
ReadFile(hCmdRead,szReadBuff,MAX_SIZE,&dwReadBuff,NULL);

// timeout
if (strstr(szReadBuff,szTimeOut) != NULL)
{
printf(szCmd);
printf("can't connect!\n");
memset(szDeadIP,0,128);
memcpy(szDeadIP,szShhIP,128);
break;
}

// store key
if (strstr(szReadBuff,szStoreKey) != NULL)
{
WriteFile(hMainWrite,"n\n",3,&dwWriteBuff,NULL);
//第一次返回的是这个信息,writefile后可读取到子进程新的返回信息
continue;
}

// access denied
if (strstr(szReadBuff,szNeedPass) != NULL)
{
WriteFile(hMainWrite,"exit\n",6,&dwWriteBuff,NULL);
//第二次读取后返回的信息needpass,输入pass后,readfile就读取不到信息了
continue;
}
}
CloseHandle(hMainWrite);
CloseHandle(hCmdRead);
CloseHandle(hMainRead);
CloseHandle(hCmdWrite);
TerminateProcess(pi.hThread,0);



补充:子程序已经测试过,在needpass后输入如果输入pass错误,继续返回needpass,成功则是另外一段字符。
...全文
132 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
surmount 2013-12-04
  • 打赏
  • 举报
回复
顶一下,还没人看吗?
surmount 2013-12-03
  • 打赏
  • 举报
回复
补充一下,创建的子进程是Putty的dos版本 plink 用于自动探测ssh链接是否还有效 plink -l user -pw password ipaddress szcmd是 cmd /c c:\plink -l user -pw pass ipaddress 第一次read到的信息为是否存储Key,输入n 后面就会用user:pass登陆ip,如果密码错误,返回user@ip's password need: 第二次read到这个信息后,想输入另一个密码,write成功,但是循环后,不能read
surmount 2013-12-03
  • 打赏
  • 举报
回复
顶一下,别沉了,还是没有解决。。。

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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