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
由于生产者被消费者阻塞,消费者被另一个消费者阻塞。在以上条件下如果顺序读取输出以及错误消息时,则极有可能导致死锁
五、解决办法
读取开始时创建一个线程读取错误消息,然后主线程再读取输出信息。
- CreateProcess重定向输出与错误以及相关注意事项
- CreateProcess输出重定向
- Createprocess控制台程序输出重定向
- Createprocess控制台程序输出重定向
- Linux重定向及标准输入、输出、错误相关
- 重定向标准输入,输出以及错误流
- 重定向标准输入,输出以及错误流
- createprocess 输入输出重定向
- 重定向标准错误输出
- linux输出错误重定向
- 重定向标准错误输出
- 重定向标准错误输出
- kshell 标准输入输出 >(重新输出) >>(追加输出) 以及2>(标准错误输出)以及输出重定向/dev/null
- 重定向输入与输出
- windows命令行输出重定向和错误重定向
- windows命令行输出重定向和错误重定向
- Java输出输入错误流重定向
- nohup 后台运行,以及重定向标准输出和标准错误 &/dev/null 文件
- Swift中的本地化实现
- HDU4405:Aeroplane chess(概率dp & 期望)
- Mastering Spring 5 0,Java SE Course Material 电子书
- iOS AFNnetworking详解
- php学习(1)——php基础
- CreateProcess重定向输出与错误以及相关注意事项
- 总结
- 2017.7.15雷雨
- 扩展欧几里得算法及其应用
- SpringMVC
- 7GOJ 偶像 [线段树]
- 剑指offer--面试题24:反转链表
- osg模型的移动,旋转和缩放
- 欢迎使用CSDN-markdown编辑器