C CreateProcess exec系统命令

时间:2017-11-06 00:19:18

标签: c windows createprocess

C BEGINNER WARNING !!!
我在c中编写一个应用程序,它应该在“cmd.exe”的上下文中运行用户定义的命令,并将输出写入变量。例如,如果命令变量是“dir C:\”,则c程序应该使用CreateProcess()来启动cmd.exe,输入“dir C:\”并将输出返回给变量。截至目前,我到目前为止的代码是:

char cmmndoutput[256];
char userdefcmmnd[256] = "dir C:\\";
STARTUPINFO sui;
PROCESS_INFORMATION pi;
memset(&sui, 0,sizeof(sui));
sui.cb = sizeof(sui);
sui.dwFlags = (STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW);
sui.hStdInput = userdefcmmnd[];
sui.hStdOutput = cmmndoutput[];
TCHAR cmdvar[256] = "cmd.exe";
CreateProcess(cmdvar, userdefcmmnd, NULL, NULL, TRUE, 0, NULL, NULL, &sui, &pi);

// wait 5 seconds or program exit somehow

printf("%s",cmmndoutput[]); // or do something with the output 

注意:程序应该等待命令的特定时间,并且等待cmd.exe退出,如system()那样。

感谢您的耐心等待,我是c的新手,并且在这段代码中肯定有很多错误。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:1)

sui.hStdInput = userdefcmmnd[];
sui.hStdOutput = cmmndoutput[];

hStdInputhStdOutput不是数组。它们采用句柄,通常是CreatePipe()的结果,但也可以使用文件句柄。

一般表单是使用两次或三次调用CreatePipe(),其中SECURITY_ATTRIBUTES bInheritHandles = TRUESetHandleInformation()未被重定向,以防止转发。来自CreatePipe()的句柄可以FILE *后跟_open_osfhandle()转换为_fdopen()个对象。

由于您的五秒超时要求,您将无法在读取端使用FILE *个对象。管道把手和背景流是棘手的事情。我已经超时工作的唯一方法是使用后台线程来使用ReadFile()读取管道输入,并在达到超时时使用CancelIoEx()放弃。

你声称自己是一名C程序员。对不起。高级主题的数量,这些代码调用了多进程,多线程的高级主题,以及Windows底层IO的轻微错误和一般复杂性。如果你能做到这一点,你会更快乐。