当要执行一些系统命令完成一些任务时,会调用Createprocess/system/_popen。后两者运行时会出现cmd对话框窗口,有碍观瞻。Createprocess也有同样问题,但是可以通过cmd /C Command来解决这个问题。但是,简单调用Createprocess来执行命令又失去了调用_popen/fgets/_pclose这种方式的交互性,因此,就想到有没有办法让Createprocess具有重定向的功能,网上转了一圈找到了解决方案。大概代码如下:
#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; }
代码没什么复杂的,只是有2个注意点,否则CreateProcess的标准输入输出无法重定向到文件中:
1.调用CreateFile时,需要传入安全描述属性SECURITY_ATTRIBUTES sa;
SECURITY_ATTRIBUTES!bInheritHandle字段为TRUE,意为安全描述的对象能被新创建的进程继承
2.调用CreateProcess时,参数5:bInheritHandles为TRUE,意为新进程从调用进程处继承了句柄