我知道如何通过匿名管道执行此操作,只需创建一个匿名管道,然后在执行createprocess()之前,将startupInfo设置如下:
startupInfo.hStdInput = hstdinRead;//hstdinRead is the handle of the pipe
startupInfo.hStdOutput = hstdoutWrite;
但是当我使用命名管道时可以做同样的事情吗? 我试图通过CreateNamedPipeA函数创建一个命名管道,并在上面进行了类似的操作,但似乎根本无法正常工作。 我应该进行一些预设还是通过命名管道在进程及其子进程之间进行通信是不可能的吗?
而且:我的子进程是不可更改的.exe,因此在父进程中的createprocess()函数之前,我必须做所有这些事情。
20180804:感谢您的评论,我仍在完善我的英语,我使用命名管道的代码如下。 首先,我创建了两个命名管道,并确认它们成功:
inFileWrite = CreateNamedPipeA("\\\\.\\pipe\\cmder_in", PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE, 10, 4096, 4096, 0, &saAttr);//for writting to the child process
outFileRead = CreateNamedPipeA("\\\\.\\pipe\\cmder_out", PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE, 10, 4096, 4096, 0, &saAttr);//for reading from the child process
然后我尝试以相同的过程连接到这些管道(对此步骤有些困惑)
inFileRead = CreateFileA("\\\\.\\pipe\\cmder_in", GENERIC_READ, FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, &saAttr)
outFileWrite = CreateFileA("\\\\.\\pipe\\cmder_out", GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, &saAttr);
在其他一些初始化步骤之后,我为子进程创建一个STARTUPINFO结构,在其中尝试重定向其std输入/输出:
startupInfo.hStdInput = inFileRead;
startupInfo.hStdOutput = outFileWrite;
最后是创建过程:
char cmdLine[] = { "cmd" };
CreateProcess(NULL,
cmdLine,
NULL,
NULL,
TRUE,
0,
NULL,
NULL,
&startupInfo,
&procInfo);
这些所有代码似乎都能正常工作,但是当我编写“ cd ..”之类的命令并尝试通过管道从子进程读取结果时,它什么也不会读取。我认为问题是我没有成功重定向子进程的stdin / out。
我通过在Linux中使用匿名管道或命名管道成功完成了类似的操作。我是Windows编程的新手,这个问题困扰了我很长时间。