【问题标题】:Pipe input/output to a process管道输入/输出到进程
【发布时间】:2012-08-16 09:41:59
【问题描述】:

我的管道工作有些困难。我有以下代码:

/* Set security attributes */
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE; 
sa.lpSecurityDescriptor = NULL; 

if (CreatePipe(&Rread, &Rwrite, &sa, 0) == 0 || SetHandleInformation(Rread, HANDLE_FLAG_INHERIT, 0) == 0 || CreatePipe(&Wread, &Wwrite, &sa, 0) == 0 || SetHandleInformation(Wwrite, HANDLE_FLAG_INHERIT, 0) == 0)
{
    /* Error */
}


/* Set process information */
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdOutput = Rwrite;
si.hStdError = Rwrite;


if (CreateProcess(NULL, argsCasted->cmd, NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi) == 0)
{
    /* Error */
}


for (;;)
{
    PeekNamedPipe(Rread, NULL, 0, &a, NULL, NULL);

    if (a > 0)
    {
        /* Write output somewhere... */
    }

    if (a == 0 && GetExitCodeProcess(pi.hProcess, &c) != 0 && c != STILL_ACTIVE) break;

    Sleep(50);
}


    /* CloseHandles... */

    /* Free stuff... */

现在,当我添加 si.hStdInput = Wread;(以便我可以向进程发送输入)时,PeekNamedPipe() 会阻塞。

我大大简化了代码,因为它是大型多线程应用程序的一部分,它太大了,无法在此处发布。如果有人需要我提供更多详细信息来解决此问题,请在此处发布,我将添加所需的详细信息。

提前致谢 乔里。

【问题讨论】:

    标签: c windows pipe stdout stdin


    【解决方案1】:

    PeekNamedPipe 如果管道中没有要读取的数据,将阻塞。您将不得不使用异步/非阻塞 I/O。

    参考:asynchronous IO

    【讨论】:

    • 是的,我知道,但只有当我添加:si.hStdInput = Wread;?为什么会这样?
    • @Jori:最可能的原因是外部程序的行为不同,具体取决于它是否具有有效的标准输入句柄。你是如何初始化si的?
    • STARTUPINFO si = sizeof(STARTUPINFO);
    • 我不确定如果在定义 STARTF_USESTDHANDLES 时将 hStdInput 设置为 NULL 会发生什么,但我怀疑您这样做会混淆子进程。无论如何,我认为底线是 PeekNamedPipe 不可靠,所以你不应该使用它 - 文档说有时它会阻塞,有时它不会,但没有正确描述阻塞将或获胜的条件'不会发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多