首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在Windows中读取子进程的stdout?

在Windows中,可以使用以下方法读取子进程的stdout:

  1. 使用CreateProcess函数创建子进程,并将子进程的标准输出重定向到一个匿名管道。
  2. 使用CreatePipe函数创建一个匿名管道,其中一个端口用于子进程的标准输出,另一个端口用于父进程读取子进程的输出。
  3. 使用SetHandleInformation函数将管道的写入端口设置为不可继承,以确保只有父进程可以访问它。
  4. 在子进程中,使用SetStdHandle函数将标准输出重定向到管道的写入端口。
  5. 在父进程中,使用ReadFile函数从管道的读取端口读取子进程的输出。

以下是一个示例代码:

代码语言:txt
复制
#include <windows.h>
#include <iostream>

int main()
{
    SECURITY_ATTRIBUTES saAttr;
    HANDLE hChildStdoutRead = NULL;
    HANDLE hChildStdoutWrite = NULL;

    // 创建匿名管道
    saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
    saAttr.bInheritHandle = TRUE;
    saAttr.lpSecurityDescriptor = NULL;
    if (!CreatePipe(&hChildStdoutRead, &hChildStdoutWrite, &saAttr, 0))
    {
        std::cerr << "CreatePipe failed" << std::endl;
        return 1;
    }

    // 设置管道写入端口为不可继承
    if (!SetHandleInformation(hChildStdoutWrite, HANDLE_FLAG_INHERIT, 0))
    {
        std::cerr << "SetHandleInformation failed" << std::endl;
        return 1;
    }

    // 创建子进程
    PROCESS_INFORMATION piProcInfo;
    STARTUPINFO siStartInfo;
    BOOL bSuccess = FALSE;

    ZeroMemory(&piProcInfo, sizeof(PROCESS_INFORMATION));
    ZeroMemory(&siStartInfo, sizeof(STARTUPINFO));
    siStartInfo.cb = sizeof(STARTUPINFO);
    siStartInfo.hStdError = hChildStdoutWrite;
    siStartInfo.hStdOutput = hChildStdoutWrite;
    siStartInfo.dwFlags |= STARTF_USESTDHANDLES;

    bSuccess = CreateProcess(NULL,
        "your_command", // 替换为要执行的命令
        NULL,
        NULL,
        TRUE,
        0,
        NULL,
        NULL,
        &siStartInfo,
        &piProcInfo);

    if (!bSuccess)
    {
        std::cerr << "CreateProcess failed" << std::endl;
        return 1;
    }

    // 关闭不需要的管道句柄
    CloseHandle(hChildStdoutWrite);

    // 读取子进程的输出
    const int BUFFER_SIZE = 4096;
    char buffer[BUFFER_SIZE];
    DWORD bytesRead = 0;
    std::string output;

    while (true)
    {
        bSuccess = ReadFile(hChildStdoutRead, buffer, BUFFER_SIZE, &bytesRead, NULL);
        if (!bSuccess || bytesRead == 0)
            break;

        output.append(buffer, bytesRead);
    }

    // 输出子进程的输出
    std::cout << "Child process output: " << output << std::endl;

    // 等待子进程退出
    WaitForSingleObject(piProcInfo.hProcess, INFINITE);

    // 关闭进程和管道句柄
    CloseHandle(piProcInfo.hProcess);
    CloseHandle(piProcInfo.hThread);
    CloseHandle(hChildStdoutRead);

    return 0;
}

请注意,上述示例代码仅演示了如何在Windows中读取子进程的stdout,并不涉及云计算相关内容。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

何在进程读取(外部)进程标准输出和标准错误输出结果

最近接手一个小项目,要求使用谷歌aapt.exe获取apk软件包信息。依稀记得去年年中时,有个同事也问过我如何获取被调用进程输出结果,当时还研究了一番,只是没有做整理。...这个API参数非常多,我想我们工程对CreateProcess调用可能就关注于程序路径(lpApplicationName),或者命令行(lpCommandLine)。...它是我们启动进程时,控制进程启动方式参数。...我们之后将hWrite交给我们创建进程,让它去将信息写入管道。而我们父进程,则使用hRead去读取进程写入管道内容。...我想应该有人借用过网上相似的代码,但是却发现一个问题,就是读取出来信息是不全。这个问题关键就在读取方法上,其实没什么玄妙,只要控制好读取起始位置就行了。

3.9K10

Windows内核之进程终止和进程

1 进程终止方法: 主线程进入点函数返回(最好使用这种方法) 进程一个线程调用ExitProcesss函数(应该避免使用这样方法)。...还有一个进程线程调用TerminateProcess函数(应该避免使用这样方法)。 进程全部线程自行终止执行(这样情况差点儿从未发生)。...它做事情: 全部打开句柄被关闭 全部线程会被终止 进程对象状态变为终止,满足全部等待进程结束线程 进程全部线程对象状态变为终止,满足全部等待线程结束线程 ...3 进程 程序要实现一段功能一共同拥有3种方法: 调用函数 开辟新线程 开辟新进程 3.1 调用函数 调用函数时很常见,可是它缺点是由于在同一个线程...3.3 开辟进程 这样有点是既能够保护数据,能够同步运行,也能够等待新进程运行完成再去运行其它进程代码。缺点是开辟新进程,会造成地址空间浪费。

1.7K20
  • 何在 Python 终止 Windows 上运行进程

    当深入研究Windows操作系统上Python开发领域时,无疑会出现需要终止正在运行进程情况。这种终止背后动机可能涵盖多种情况,包括无响应、过度资源消耗或仅仅是停止脚本执行必要性。...在这篇综合性文章,我们将探讨各种方法来完成使用 Python 终止 Windows 上运行进程任务。...值得注意是,Windows利用“taskkill”命令来终止活动进程。...方法3:释放“流程”模块力量 Python 进程”模块赋予我们生成新进程能力,与它们输入/输出/错误管道建立连接,并检索它们返回代码。...shell=True' 参数在 Windows 命令外壳执行命令时变得不可或缺。 结论 在这次深入探索,我们阐明了使用 Python 终止 Windows 上运行进程三种不同方法。

    48230

    Windows何在父子进程间传递SOCKET句柄

    最近有个需求,需要进行父子进程通信,常见方案是在创建进程时通过stdin、stdout、stderr这三个句柄来传递管道句柄,从而达到父子进程间通信目的。...但这种方式最大问题是:对子进程需要单独处理stdout和stderr,使用上有些限制。 经过调研之后,放弃了管道这种方式,因为匿名管道不支持异步读写,不符合我们使用场景。...然后,考虑将SOCKET句柄传递给进程,进而进行通信。 0x01 复制句柄 Windows中有一个复制句柄API:DuplicateHandle。...,也可以将其它进程某个句柄复制到当前进程。...因此,我们可以在父进程创建一个socket对象,然后将句柄id通过命令行参数传递给进程;然后进程将该句柄真正复制到当前进程,并转换成socket对象即可。

    19510

    何在keras添加自己优化器(adam等)

    本文主要讨论windows下基于tensorflowkeras 1、找到tensorflow根目录 如果安装时使用anaconda且使用默认安装路径,则在 C:\ProgramData\Anaconda3...2、找到keras在tensorflow下根目录 需要特别注意是找到keras在tensorflow下根目录而不是找到keras根目录。...找到optimizers.pyadam等优化器类并在后面添加自己优化器类 以本文来说,我在第718行添加如下代码 @tf_export('keras.optimizers.adamsss') class...# 传入优化器名称: 默认参数将被采用 model.compile(loss=’mean_squared_error’, optimizer=’sgd’) 以上这篇如何在keras添加自己优化器...(adam等)就是小编分享给大家全部内容了,希望能给大家一个参考。

    45K30

    Windows杀死占用某个端口进程

    最近在写Java web项目的时候,总是会出现Tomcat端口被占用问题,这是因为Tomcat8080端口在启动之后代码缺陷忘记停止进程,导致后面想再次启动时可能会出现端口被占用bug,那么怎么去解决这一...第一步,打开cmd命令窗口,输入命令,根据端口号查找对应进程号 netstat -ano | findstr 80 //列出进程极其占用端口,且包含 80 发现 8080 端口被 PID(进程号)为...9268 进程占用。...第二步, 据进程号寻找进程名称 tasklist | findstr 9268 根据进程号从任务管理器查找该程序,手动杀死即可。 但是我发现,在任务管理器找不到该程序。...只好从命令行杀死该程序了,命令如下: taskkill -PID -F //强制关闭某个进程 这样就把占用8080端口进程给干掉了

    36220

    Windows杀死占用某个端口进程

    大家好,又见面了,我是你们朋友全栈君。 启动tomcat时候,控制台报错,发现是端口占用,于是寻找方法关闭对应程序。 从网上找了好久,尝试之后,发现不行。...开始自己尝试,终于,成功将占用端口进程杀掉。...在此记录下过程(以8081端口为例): 第一步,根据端口号查找对应进程号 netstat -ano | findstr 8081 //列出进程极其占用端口,且包含 8081 结果如下: 发现...8081 端口被 PID(进程号)为 2000 进程占用。...第二步,据进程号寻找进程名称 tasklist | findstr 2000 从任务管理器查找该程序,手动杀死即可。 至此,已经完成。 但是我发现,在任务管理器找不到该程序。

    1.5K10

    如何读取Linux进程代码段和数据段

    Linux下程序文件格式是ELF,里面分了各种段,有代码段、数据段、等。当运行这个程序时,系统也会给这个进程创建虚拟内存,然后把ELF数据分别加载到内存对应位置。...本文整理了用cpp程序读取内存代码段和rodata数据段方法。.../proc/pid/mem mem是内核创建虚拟文件,是Linux”一切皆文件”在进程体现,但是这个文件无法直接进行读取,需要先利用ptrace进行绑定操作。...用ptrace绑定之后就可以用read来读取这个“文件”了,但是要注意输入读取地址不对,也读不出数据来。...用程序读取内存代码段和rodata数据段 以tcpdump程序为例,用程序读取代码段和radata过程如下: 1.查看tcpdump进程ID。

    3.8K20

    Python用subprocessPopen来调用系统命令

    可是这两个命令过于简单,不能完毕一些复杂操作,给执行命令提供输入或者读取命令输出,推断该命令执行状态,管理多个命令并行等等。...參数Close_sfs:在windows平台下,假设close_fds被设置为True,则新创建进程将不会继承父进程输入、输出、错误管 道。...參数startupinfo与createionflags仅仅在windows下用效,它们将被传递给底层CreateProcess()函数,用 于设置进程一些属性,:主窗体外观,进程优先级等等...向stdin发送数据,或从stdout和stderr读取数据。可选參数input指定发送到进程參数。 Communicate()返回一个元组:(stdoutdata, stderrdata)。...相同, 果希望从stdout和stderr获取数据,必须将stdout和stderr设置为PIPE。 Popen.send_signal(signal) 向进程发送信号。

    1.8K20

    python执行DOS命令3种方法小

    参数Close_sfs:在windows平台下,如果close_fds被设置为True,则新创建进程将不会继承父进程输入、输出、错误管 道。...参数Universal_newlines:不同操作系统下,文本换行符是不一样windows下用’/r/n’表示换,而Linux下用 ‘/n’。...参数startupinfo与createionflags只在windows下用效,它们将被传递给底层CreateProcess()函数,用 于设置进程一些属性,:主窗口外观,进程优先级等等。...向stdin发送数据,或从stdout和stderr读取数据。可选参数input指定发送到进程参数。 Communicate()返回一个元组:(stdoutdata, stderrdata)。...同样, 果希望从stdout和stderr获取数据,必须将stdout和stderr设置为PIPE。 Popen.send_signal(signal)  向进程发送信号。

    2.2K20

    python模块之subprocess类与常量

    stdin, stdout, stderr参数特殊值,意味着使用管道重定向输入输出 subprocess.STDOUT:可传递给stderr参数特殊值,表示重定向标准错误到标准输出 Popen 在一个新进程执行子程序...唯一需要指定shell=True场景是要执行指令是shell内置dir, copy。...进程文件句柄继承自父进程。除此之外,stderr还可以是STDOUT,表示标准错误输出重定向到标准输出。 preexec_fn:限于POSIX系统,设置一个可调用对象,先于进程程序执行。...communicate(input=None, timeout=None):进程交互:发送数据到stdin,读取stdout或stderr数据知道读取到结束符。...POSIX系统上,发送SIGTERM信号到进程Windows系统上会调用TerminateProcess()终止进程 kill():强制终止进程

    2.5K10

    何在Linux查看所有正在运行进程

    它能显示当前运行中进程相关信息,包括进程PID。Linux和UNIX都支持ps命令,显示所有运行中进程相关信息。ps命令能提供一份当前进程快照。如果你想状态可以自动刷新,可以使用top命令。...ps命令 输入下面的ps命令,显示所有运行进程: # ps aux | less 其中, -A:显示所有进程 a:显示终端包括其它用户所有进程 x:显示无控制终端进程 任务:查看系统每个进程...# ps -A # ps -e 任务:查看非root运行进程 # ps -U root -u root -N 任务:查看用户vivek运行进程 # ps -u vivek top命令 top命令提供了运行系统动态实时视图...在命令提示行输入top: # top 输出: 图1:top命令:显示Linux任务 按q退出,按h进入帮助。 显示进程树状图 pstree以树状显示正在运行进程。树根节点为pid或init。...它能展现系统层级关键硬件资源(从性能角度)使用情况,CPU、内存、硬盘和网络。

    61.3K71
    领券