尝试重定向cmd.exe标准输出时没有输出
No output while trying to redirect cmd.exe stdout
我写了一个小程序,它应该通过给它一个命令来重定向cmd.exe stdout,并使用管道来获取输入。
程序在使用像ipconfig
这样的命令时工作得很好,但是当我试图将tasklist
作为命令传递时,例如,程序就会卡住并且不会得到任何输出。
代码如下:
#include <Windows.h>
#include <tchar.h>
#include <iostream>
#define BUFFSIZE 100000
int wmain(int argc, wchar_t* argv[])
{
HANDLE hReadPipe, hWritePipe;
SECURITY_ATTRIBUTES saAttr;
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;
if (CreatePipe(&hReadPipe, &hWritePipe, &saAttr, 0) != 0)
{
STARTUPINFO structStartUpInfo;
ZeroMemory(&structStartUpInfo, sizeof(STARTUPINFO));
structStartUpInfo.cb = sizeof(STARTUPINFO);
structStartUpInfo.wShowWindow = SW_HIDE;
structStartUpInfo.hStdInput = hReadPipe;
structStartUpInfo.hStdOutput = hWritePipe;
structStartUpInfo.dwFlags = STARTF_USESTDHANDLES;
PROCESS_INFORMATION structProcInf;
ZeroMemory(&structProcInf, sizeof(PROCESS_INFORMATION));
if (CreateProcess(NULL, L"tasklist", NULL, NULL, TRUE, NORM AL_PRIORITY_CLASS, NULL, NULL, &structStartUpInfo, &structProcInf) != 0)
{
WaitForSingleObject(structProcInf.hProcess, INFINITE);
CHAR output[BUFFSIZE];
DWORD wdByteToRead = BUFFSIZE;
DWORD dwByteread;
ReadFile(hReadPipe, output, wdByteToRead, &dwByteread, NULL);
std::string final = output;
final = final.substr(0, dwByteread);
std::cout << final.c_str();
}
}
return 0;
我该如何解决这个问题?
管道有一个最大缓冲区大小。tasklist
可能写入缓冲区大小而不阻塞,但在此之后写入时阻塞。
通过查看代码,子进程需要读取自己的输入以避免阻塞。
您需要调用CreatePipe
两次,然后将其中一对的读管道和另一对的写管道保留给自己(父进程),将前一对的写管道和后一对的读管道提供给子进程。
即便如此,管道也有一个最大缓冲区大小。为了避免子进程阻塞,你必须一直从父进程的管道中读取数据。
编辑:如果你不打算写到子进程,你也可以关闭父进程的写端管道或设置hStdInput
为零。
同样,您应该初始化hStdError
,要么使用另一个管道的写入端,要么将其设置为零。
基于Microsoft C运行时(其中之一)的程序在标准句柄为零时简单地忽略它,但其他程序可能不会,因此拥有3对管道可能是最安全的方法。但是,您还必须从该管道中读取数据,以避免子进程在写入时阻塞,尽管这种情况不太可能发生。
相关文章:
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- 使用提升过程获取 shell 命令的标准输出
- 将标准输出重定向到ostream
- 如何在C++中执行命令并获取命令的返回代码标准输出和标准
- 在程序执行期间从标准输出重定向到自定义流
- 标准输出C++意外行为
- 防止 qDebug() 写入标准输出
- C++ - <<运算符重载,链表 - 地址而不是标准输出
- 有没有办法知道C++中将打印到标准输出的大小?
- 最后推迟标准输出
- 得到~对标准输出没有回应~在黑客排名问题上
- Win32 GUI C(++) 应用将标准输出和标准输出重定向到磁盘上的同一文件
- 在标准输出中执行打印会导致数组中随机分配值
- 捕获远程进程子进程的标准输出
- 使用 QProcess 读取标准输出
- 如何将值发送到标准输出流并在另一个程序中访问这些值
- 无法使用创建进程重定向标准输出
- HackerRank说~对标准输出没有回应~.C++
- 记录标准输入和标准输出
- 我可以重定向两个子进程的标准输出吗?