VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 2353|回复: 3

[交流] 匿名管道取不到数据

[复制链接]
79_avatar_middle
最佳答案
0 
在线会员 发表于 2015-8-17 13:30:45 | 显示全部楼层 |阅读模式
本帖最后由 nihao2015 于 2015-8-17 13:32 编辑
  1. #include<windows.h>
  2. #include<stdio.h>
  3. int main()
  4. {
  5.         HANDLE read=NULL,write=NULL;
  6.         SECURITY_ATTRIBUTES ss;       
  7.         STARTUPINFO sa={0};       
  8.         PROCESS_INFORMATION pp={0};                                                //定义结构体SECURITY_ATTRIBUTES变量
  9.         char text[]="匿名管道程序测试!";
  10.         DWORD writetext;
  11. ss.nLength=sizeof(ss);                                                        //填充结构体中的各成员
  12. ss.lpSecurityDescriptor=NULL;
  13. ss.bInheritHandle=TRUE;
  14. if(CreatePipe(&read,&write,&ss,0))                                        //创建匿名管道
  15. {
  16.    printf("创建匿名管道成功\r\n");                                                                //定义并初始化结构体
  17. sa.cb=sizeof(sa);                                                                                //填充结构体中的各个成员
  18. sa.dwFlags=STARTF_USESHOWWINDOW;
  19. sa. hStdInput=read;
  20. sa. hStdOutput=write;
  21. sa. hStdError= GetStdHandle(STD_ERROR_HANDLE);
  22. sa.wShowWindow=SW_MAXIMIZE;
  23. if(::CreateProcess(NULL,"子进程.exe",NULL,NULL,TRUE,0,NULL,NULL,&sa,&pp))
  24. {
  25.         printf("创建子进程成功\r\n");
  26.         WriteFile(write,text,sizeof(text),&writetext,NULL);
  27. printf("通过匿名管道写入数据成功\r\n");
  28. }
  29. else
  30. {
  31. printf("创建子进程失败\r\n");
  32.                 }
  33.         }
  34. }
复制代码

父进程

子进程
  1. #include<windows.h>
  2. #include<stdio.h>
  3. int main()
  4. {
  5.         HANDLE read=NULL;
  6.         char text[100]="匿名管道程序测试!";
  7.         DWORD readtext;
  8.         read=GetStdHandle(STD_INPUT_HANDLE);
  9. if(ReadFile(read,text,100,&readtext,NULL)==0)
  10. {
  11.         printf("从匿名管道中读取的数据是:%s\r\n",text);
  12. }
  13. Sleep(10000);
  14. return 0;
  15. }
复制代码



为什么子进程取不到数据




上一篇:MFC如何加载光标
下一篇:C++ 随机数生成
81_avatar_middle
最佳答案
3 
online_supermod 发表于 2015-8-17 14:56:02 | 显示全部楼层
你这里存在一个异步响应的问题,比如父进程创建完子进程写入数据之后可能马上就执行完毕结束了,此时子进程再去从管道中读数据,恐怕读不出来,所以,可以先让父进程等待个几秒钟,等子进程读完数据之后再退出,试试吧,楼主
78_avatar_middle
最佳答案
0 
online_supermod 发表于 2015-8-17 17:43:29 | 显示全部楼层
  1. int do_command(char *cmdline, string &result, int timeout)
  2. {
  3.     result.clear();

  4.     HANDLE rpipe;
  5.     HANDLE wpipe;
  6.     STARTUPINFOA si;
  7.     DWORD exit_code;
  8.     SECURITY_ATTRIBUTES sa;
  9.     PROCESS_INFORMATION pi;

  10.     memset(&sa, 0, sizeof(sa));
  11.     memset(&si, 0, sizeof(si));
  12.     memset(&pi, 0, sizeof(pi));

  13.     sa.nLength = sizeof(sa);
  14.     sa.bInheritHandle = TRUE;
  15.     sa.lpSecurityDescriptor = NULL;
  16.     if (!CreatePipe(&rpipe, &wpipe, &sa, 0)) {
  17.         return -1;
  18.     }

  19.     si.cb = sizeof(si);
  20.     si.dwFlags = STARTF_USESTDHANDLES;
  21.     si.hStdOutput = si.hStdError = wpipe;
  22.     si.hStdInput = stdin;
  23.     if (!CreateProcessA(NULL, cmdline, NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) {
  24.         CloseHandle(rpipe);
  25.         CloseHandle(wpipe);
  26.         return -2;
  27.     }

  28.     DWORD start_time = GetTickCount();
  29.     while (true) {
  30.         if (timeout != -1) {
  31.             if (GetTickCount() - start_time > (unsigned)timeout) {
  32.                 TerminateThread(pi.hThread, -3);
  33.                 TerminateProcess(pi.hProcess, -3);
  34.                 break;
  35.             }
  36.         }

  37.         DWORD total = 0;
  38.         if (!PeekNamedPipe(rpipe, NULL, 0, NULL, &total, NULL))
  39.             break;

  40.         if (total == 0) {
  41.             DWORD wait = WaitForSingleObject(pi.hProcess, 100);
  42.             if (wait == WAIT_TIMEOUT) {
  43.                 continue;
  44.             }
  45.             else if (wait == WAIT_OBJECT_0) {
  46.                 if (!PeekNamedPipe(rpipe, NULL, 0, NULL, &total, NULL))
  47.                     break;
  48.                 if (total == 0)
  49.                     break;
  50.                 else
  51.                     continue;
  52.             }
  53.         }

  54.         string str;
  55.         str.resize(total);
  56.         DWORD read = 0;
  57.         if (!ReadFile(rpipe, (void *)str.data(), total, &read, NULL))
  58.             break;

  59.         result += str.c_str();
  60.     }

  61.     GetExitCodeProcess(pi.hProcess, &exit_code);
  62.     CloseHandle(wpipe);
  63.     CloseHandle(rpipe);
  64.     CloseHandle(pi.hThread);
  65.     CloseHandle(pi.hProcess);

  66.     if (exit_code != 0)
  67.         return -3;

  68.     return 0;
  69. }
复制代码
79_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2015-8-18 01:39:35 | 显示全部楼层
我找到问题了  现在已经决绝了  谢谢各位的回答
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-10-22 14:00

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表