在Windows上等待进程或标准输出

西蒙·帕克

我正在使用CreateProcess触发一个进程,并且我想等待该进程完成,或者要将任何内容写到标准输出中,这是通过匿名管道进行的。下面的代码不起作用,因为WaitForMultipleObjects不断返回stdout管道,即使没有要读取的内容也是如此。有没有办法等待管道?我等不及要阅读,因为如果过程完成,我也需要继续。我也不能等到过程完成而不检查管道,因为管道可能会溢出。有任何想法吗?

if (::CreateProcess(
    (!application_name.empty() ? application_name.c_str() : NULL),  // Application/Executable name, if supplied.
    lpCommandLine,                                                  // Arguments or Executable and Arguments
    NULL,                               // Process Attributes
    NULL,                               // Thread Attributes
    TRUE,                               // Inherit handles
    CREATE_NO_WINDOW,                   // Create flags
    NULL,                               // Environment (Inherit)
    current_directory.c_str(),          // Working Directory
    &m_startup_info,                    // Startup Info
    &process_info                       // Process Info
))
{
    HANDLE  handles[2];
    bool    waiting = true;

    handles[0] = process_info.hProcess;
    handles[1] = m_read_stdout; // previously created with CreatePipe. One end handed to CreateProcess

    // Must process stdout otherwise the process may block if it's output buffer fills!!
    while (waiting)
    {
        DWORD r = ::WaitForMultipleObjects(2, handles, FALSE, INFINITE);

        switch (r)
        {
        case WAIT_OBJECT_0+0:
            waiting = false;
            break;
        case WAIT_OBJECT_0+1:
            AppendSTDOUTFromProcess(output);
            break;
        default:
            ATLASSERT(FALSE);
            break;
        }
    }
}
雷米·勒博(Remy Lebeau)

管道不是可等待的对象,因此您不能在WaitFor...()函数中使用它们您可以:

  1. 用于WaitForSingleObject()仅等待过程句柄,并为其指定超时,以便您的循环定期唤醒,然后可以调用PeekNamedPipe()以检查管道中的数据。

  2. 在单独的线程中读取管道,在没有可用数据时让读取块,然后在管道关闭时终止线程。然后,您可以使用它WaitForMultipleObjects()来等待进程和线程句柄。

  3. 根本不要等待流程句柄。只需从管道中读取循环,在没有可用数据时阻塞即可,直到在管道关闭时读取失败为止。这是Microsoft的示例使用的方法

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

读取正在等待输入的生成进程的标准输出

Swift:如何在不等待进程完成的情况下读取子进程中的标准输出

如何获取在Linux上等待CPU的进程数?

找出在Linux上等待I / O的进程被阻塞的时间

如何在 macos 上等待任何子进程退出

我如何等待 Rust `Child` 进程的标准输出已通过管道传输到另一个进程?

检测子进程何时等待标准输入

为什么我的Windows桌面进程似乎没有标准输出立即退出?

无法使用 Python 从 Windows 上生成的子进程读取标准输出

OpenMPI:让每个进程写入标准输出

NodeJS子进程标准输出全为数字

Python:如何从子进程的标准输出流

终止进程后读取标准输出

直接写入不同进程的标准输出

Python子进程/ Popen标准输出被截断

Java从单独的进程中获取标准输出和标准错误

如何丢弃子进程的标准输出但保留父进程的标准输出?

tomcat:在条件线程上等待

在Windows 10 C ++中通过控制台屏幕缓冲区重定向子进程标准输出

结束所有进程,但Windows标准

Python子进程:提供标准输入,读取标准输出,然后提供更多标准输入

让子进程输出到文件和标准输出/标准错误的最简单的接口?

让子进程输出到文件和标准输出/标准错误的最简单的接口?

Subprocess.Popen标准输出,等待程序完成

将生成的进程标准输出捕获为Unicode

将进程标准输出传递给外部函数

进程间通信,从多个子标准输出读取

重定向当前正在运行的 python 进程的标准输出

在python中检查正在运行的子进程的标准输出