我有这个问题;我正在编写一个必须执行 cmd 命令的 C 编码服务器。main() 必须创建一个新线程,并且该线程必须创建一个新进程,该进程必须启动此 cmd 命令并发回结果。
如果该命令只发回输出(即 dir、netstat、ls 等),这可以正常工作。但是,当我尝试使用具有 ro 等待输入为“日期”(等待新日期)的命令时,新进程冻结。这是不可能解决的,因为我可以在新进程的句柄上使用 WaitForSingleObject 并使用超时,所以如果进程有一段时间没有完成,我可以使用 TerminateProcess() 终止它。
但是使用进程 cmd.exe 将继续运行,因为它是由我的服务器进程启动的,并且从未关闭。
我不关心需要输入的命令,我只想忽略它们,这样如果 _popen 等待某些东西,我只需关闭 cmd 并返回。
是否有某种方法可以避免 _popen 冻结需要输入的命令的情况?
这里是运行_popen的进程的代码
char readBuff[8096];
DWORD readed;
ReadFile(pipe,readBuff,8096,&readed,NULL);
FILE * out=_popen(commandToExec,"r"); //assume commandToExec contains "date"
char buffer[128];
char output[8096];
output[0]='\0';
while(fgets(buffer, 128, out)){
snprintf(output,8096,"%s%s\n",outputComando,buffer);
}
DWORD writed;
WriteFile(pipe,outputComando,8096,&scritti,NULL); //it writes the output to a pipe
这在仅输出命令上工作正常,但它永远不会在需要输入的命令上到达“while”(我调试过它)