CreateProcess重定向输出与错误以及相关注意事项

来源:互联网 发布:怎么学好数据库 编辑:程序博客网 时间:2024/05/20 12:22

CreateProcess重定向输出与错误以及相关注意事项

一、应用场景

需要显示通过Create Process启动的其他程序的输出以及错误信息。

二、方案的实施

1. 通过CreatePipe创建匿名读写管道。(其中需要设置第三参数SECURTY_ATTRBUTES中的bInheritHandle为TRUE需要)

2. 通过CreateProcess创建需要启动的进程。

3. 通过ReadFile方式读取相关管道。

三、伪代码

// Create pipes for stdin and stdout

CreatePipe(&hReadStdin, &hWriteStdin, NULL, 0);

CreatePipe(&hReadStdout, &hWriteStdout, NULL, 0);

 

// hook them up to the process we're about to create

startup_info.hStdOutput = hWriteStdout;

startup_info.hStdInput = hReadStdin;

 

// create the process

CreateProcess(...);

 {

// the created process write something to the stdin

WriteFile(hWriteStdin, ...);

 }


// read the result from the process's stdout

ReadFile(hReadStdout, ...)

四、方案存在的问题

如果采取在单线程中按顺序读取输出与错误消息时会由于匿名管道的机制,导致死锁。

匿名管道的中的读写类似于生产者与消费者的模式,如果生产者写入了管道则需要等到消费者读取之后才能继续进行,这时就是造成以下情况:

WriteRead

"AB""A"

Wait readEncounter error, Write to Err

Dead Lock

由于生产者被消费者阻塞,消费者被另一个消费者阻塞。在以上条件下如果顺序读取输出以及错误消息时,则极有可能导致死锁

五、解决办法

读取开始时创建一个线程读取错误消息,然后主线程再读取输出信息。


原创粉丝点击