Createprocess 输入输出重定向到文件
2016-01-07 16:09
295 查看
当要执行一些系统命令完成一些任务时,会调用Createprocess/system/_popen。后两者运行时会出现cmd对话框窗口,有碍观瞻。Createprocess也有同样问题,但是可以通过cmd /C Command来解决这个问题。但是,简单调用Createprocess来执行命令又失去了调用_popen/fgets/_pclose这种方式的交互性,因此,就想到有没有办法让Createprocess具有重定向的功能,网上转了一圈找到了解决方案。大概代码如下:
程序运行后会在当前路径下生成output.txt,ping 8.8.8.8的执行结果全都重定向到该文件内。
代码没什么复杂的,只是有2个注意点,否则CreateProcess的标准输入输出无法重定向到文件中:
1.调用CreateFile时,需要传入安全描述属性SECURITY_ATTRIBUTES sa;
SECURITY_ATTRIBUTES!bInheritHandle字段为TRUE,意为安全描述的对象能被新创建的进程继承
2.调用CreateProcess时,参数5:bInheritHandles为TRUE,意为新进程从调用进程处继承了句柄
#include <windows.h> int main() { PROCESS_INFORMATION pi; STARTUPINFO si = {sizeof(STARTUPINFO)}; SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES),NULL,TRUE}; HANDLE cmdOutput = CreateFile("./output.txt", GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, &sa,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); if(cmdOutput == INVALID_HANDLE_VALUE) { ExitProcess(0); } HANDLE cmdInput = CreateFile("./input.txt", GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, &sa,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); if(cmdInput == INVALID_HANDLE_VALUE) { ExitProcess(0); } si.hStdInput = cmdInput; si.hStdOutput = cmdOutput; si.dwFlags = STARTF_USESTDHANDLES; if(CreateProcess(NULL,"ping 8.8.8.8",NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)) { WaitForSingleObject(pi.hProcess,INFINITE); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } CloseHandle(cmdOutput); CloseHandle(cmdInput); return 0; }
程序运行后会在当前路径下生成output.txt,ping 8.8.8.8的执行结果全都重定向到该文件内。
代码没什么复杂的,只是有2个注意点,否则CreateProcess的标准输入输出无法重定向到文件中:
1.调用CreateFile时,需要传入安全描述属性SECURITY_ATTRIBUTES sa;
SECURITY_ATTRIBUTES!bInheritHandle字段为TRUE,意为安全描述的对象能被新创建的进程继承
2.调用CreateProcess时,参数5:bInheritHandles为TRUE,意为新进程从调用进程处继承了句柄
相关文章推荐
- Swift中自定义Cell
- Struts2中的包的作用描述
- java内存溢出分析(一)
- Linux安装Mysql rpm
- Java中的日期(Calendar、Date)
- Activex、OLE、COM、OCX、DLL之间区别、联系[转]
- 上市公司频推高送转 年报预告掘金“白马股”(名单)
- centos安装ORACLE 11G
- Java软件工程师等级
- 日积月累--Groovy语言规范之操作符
- 第8章3节《MonkeyRunner源码剖析》3
- ceph源码分析之Log实现
- Android中Parcelable用法
- Swift场景过渡总结
- NodeJS+Redis实现分布式Session方案
- Mysql Replication机制主从备份实践
- 【数组】Search Insert Position
- JS对于字符串的切割截取
- 【Android】在线程中使用Handler
- 初识Camera,调用系统拍照录像程序