繁体   English   中英

尝试重定向cmd.exe标准输出时无输出

[英]No output while trying to redirect cmd.exe stdout

我编写了一个小程序,应该通过给它一个命令来重定向cmd.exe stdout,并使用管道来获取输入。

当使用ipconfig类的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对管道可能是最安全的方法。 但是然后,您也必须从该管道读取数据,以免子进程在写入时阻塞,无论这种情况多么不可能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM