java stdout_如何正确读取子进程的stdout / stderr输出?

我编写了一个程序 a.exe ,它使用CreateProcess函数启动我编写的另一个程序 b.exe . 调用者创建两个管道,并将两个管道的写入端传递给CreateProcess,作为stdout / stderr句柄用于子进程 . 这几乎与MSDN上的Creating a Child Process with Redirected Input and Output样本相同 .

因为它似乎无法使用一个等待进程退出的同步调用或stdout或stderr上的数据可用(WaitForMultipleObjects函数对管道不起作用),调用者有两个运行的线程两者都在stdout / stderr管道的读取端执行(阻塞)ReadFile调用;这里's the exact code of the '读取线程程序' which is used for stdout/stderr (I didn' t自己写这段代码,我假设有些同事做了):

DWORD __stdcall ReadDataProc( void *handle )

{

char buf[ 1024 ];

DWORD nread;

while ( ReadFile( (HANDLE)handle, buf, sizeof( buf ), &nread, NULL ) &&

GetLastError() != ERROR_BROKEN_PIPE ) {

if ( nread > 0 ) {

fwrite( buf, nread, 1, stdout );

}

}

fflush( stdout );

return 0;

}

a.exe 然后使用简单的WaitForSingleObject调用等待 b.exe 终止 . 一旦该调用返回,两个读取线程终止(因为管道坏了),并且使用CloseHandle关闭两个管道的读取端 .

现在,我遇到的问题是: b.exe 可能(取决于用户输入)启动比 b.exe 本身更长的外部进程,守护进程基本上 . 在这种情况下会发生的是stdout / stderr管道的写入结束继承到该守护进程,因此管道永远不会被破坏 . 这意味着 a.exe 中的WaitForSingleObject调用返回(因为 b.exe 已完成),但CloseHandle调用任一管道块,因为两个读取线程仍然位于其(阻塞!)ReadFile调用中 .

如果在 b.exe 返回后没有用强力(TerminateThread)终止两个读取线程,我该如何解决这个问题?如果可能的话,我想避免任何涉及轮询管道和/或过程的解决方案 .

UPDATE: 这是我到目前为止所做的:

没有 b.exe 继承 a.exe ;这不起作用 . MSDN特别声明传递给CreateProcess的句柄必须是可继承的 .

清除 b.exe 里面的stdout / stderr上的可继承标志:似乎没有任何效果(如果它确实会让我感到惊讶) .

具有 ReadDataProc 过程(在两个管道上读取)考虑除了检查 ERROR_BROKEN_PIPE 之外 b.exe 是否实际运行 . 这当然不起作用(但我之后才意识到),因为线程在ReadFile调用中被阻止 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值