0

我有这个问题;我正在编写一个必须执行 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”(我调试过它)

4

1 回答 1

1

根据 popen 上的 msdn 页面,您需要额外的工作来重定向 stdin 和 stout

http://msdn.microsoft.com/en-us/library/ms682499.aspx

于 2012-04-26T18:38:17.697 回答