首页 > 其他分享 >Createprocess 输入输出重定向到文件

Createprocess 输入输出重定向到文件

时间:2022-11-07 20:37:08浏览次数:50  
标签:pi 重定向 输入输出 SHARE Createprocess si FILE NULL


当要执行一些系统命令完成一些任务时,会调用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,意为新进程从调用进程处继承了句柄

标签:pi,重定向,输入输出,SHARE,Createprocess,si,FILE,NULL
From: https://blog.51cto.com/u_13927568/5831310

相关文章