gpt4 book ai didi

C CreateProcess 执行系统命令

转载 作者:行者123 更新时间:2023-11-30 14:53:36 25 4
gpt4 key购买 nike

C 初学者警告!!!
我正在用 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

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

感谢您的耐心等待,我是 C 语言新手,这段代码中肯定有很多错误。如有任何帮助,我们将不胜感激!

最佳答案

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

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

一般形式是使用两个或三个调用 CreatePipe() 以及 SECURITY_ATTRIBUTES 以及 bInheritHandles = TRUESetHandleInformation( ) 在未被重定向的一侧,以防止其被转发。来自 CreatePipe() 的句柄可以通过 _open_osfhandle() 后接 _fdopen() 转换为 FILE * 对象.

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

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

关于C CreateProcess 执行系统命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47128059/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com