我有这个问题; 我正在编写一个必须执行cmd命令的C编码服务器。 main()必须创建一个新线程,并且该线程必须创建一个必须启动此cmd命令并发回结果的新进程。
如果命令仅发回输出(即dir,netstat,ls等),则此方法可以正常工作。但是当我尝试使用具有ro等待输入的命令作为" date" (等待新日期)新进程冻结。这是不可能解决的,因为我可以在新进程上使用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
这在仅输出命令上工作正常,但它永远不会到达"而#34;在需要输入的命令(我调试它)
答案 0 :(得分:1)
根据popen上的msdn页面,你需要额外的工作来重定向stdin和stout