Createprocess 输入输出重定向到文件

当要执行一些系统命令完成一些任务时,会调用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;
}

程序运行后会在当前路径下生成output.txt,ping 8.8.8.8的执行结果全都重定向到该文件内。

代码没什么复杂的,只是有2个注意点,否则CreateProcess的标准输入输出无法重定向到文件中:

1.调用CreateFile时,需要传入安全描述属性SECURITY_ATTRIBUTES sa;

SECURITY_ATTRIBUTES!bInheritHandle字段为TRUE,意为安全描述的对象能被新创建的进程继承

2.调用CreateProcess时,参数5:bInheritHandles为TRUE,意为新进程从调用进程处继承了句柄

你可能感兴趣的:(windows)