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的新手,并且在这段代码中肯定有很多错误。任何帮助表示赞赏!
答案 0 :(得分:1)
sui.hStdInput = userdefcmmnd[];
sui.hStdOutput = cmmndoutput[];
hStdInput
和hStdOutput
不是数组。它们采用句柄,通常是CreatePipe()
的结果,但也可以使用文件句柄。
一般表单是使用两次或三次调用CreatePipe()
,其中SECURITY_ATTRIBUTES
bInheritHandles = TRUE
和SetHandleInformation()
未被重定向,以防止转发。来自CreatePipe()
的句柄可以FILE *
后跟_open_osfhandle()
转换为_fdopen()
个对象。
由于您的五秒超时要求,您将无法在读取端使用FILE *
个对象。管道把手和背景流是棘手的事情。我已经超时工作的唯一方法是使用后台线程来使用ReadFile()
读取管道输入,并在达到超时时使用CancelIoEx()
放弃。
你声称自己是一名C程序员。对不起。高级主题的数量,这些代码调用了多进程,多线程的高级主题,以及Windows底层IO的轻微错误和一般复杂性。如果你能做到这一点,你会更快乐。