以前没接触过,现在读代码时遇到了进程间匿名管道通信的问题,在网上找了一个例子,通过管道技术,将“dir c:\” 的信息输入到主进程中
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "kernel32.lib")
void main()
{
SECURITY_ATTRIBUTES pipe;
HANDLE hRead,hWrite;
pipe.nLength = sizeof(SECURITY_ATTRIBUTES);
pipe.lpSecurityDescriptor = NULL;
pipe.bInheritHandle = TRUE;
if (!CreatePipe(&hRead,&hWrite,&pipe,0)) {
printf ("CreateProcess Error!\n");
return;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite;
si.hStdOutput = hWrite;
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
if (!CreateProcess(NULL,"cmd.exe /c dir c:\\"
,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)) {
printf ("CreateProcess Error!\n");
return;
}
CloseHandle(hWrite); //??????不理解
char buffer[4096] = {0};
DWORD bytesRead;
while (true) {
if (ReadFile(hRead,buffer,4095,&bytesRead,NULL) == NULL)
break;
puts(buffer) ;
Sleep(200);
}
}
其中的原文中讲到了下面的几句:“我们管道一端连在了新进程的标准输出端了,一端可以自己用API函数ReadFile读取了。等等,不对,我们的管道还有问题。我们把 hWrite给了hStdOutput和hStdError,那么在新的进程启动时就会在新进程中打开一个管道写入端,而我们在当前进程中使用了 CreatePipe创建了一个管道,那么在当前进程中也有这个管道的写入端hWrite。好了,这里出现了一个有两个写入端和一个读出端的畸形管道。这样的管道肯定是有问题的。由于当前进程并不使用写端,因此我们必须关闭当前进程的写端。这样,我们的管道才算真正的建立成功了。”
我的问题是还是不理解畸形管道是如何产生的?在新进程cmd中也会打开一个管道写入端吗?请大家分析一下,讲一下原理,谢谢了
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课