在C/C++程序中调用popen来执行cmd命令,且用fgets来读命令的打印,读到最后一个字节之后就陷入无尽等待

代码主要是intexecmd(constchar*cmd,char*result){charbuf[128]={0};FILE*pipe=_popen(cmd,"r");... 代码主要是

int execmd(const char *cmd,char* result)
{
char buf[128]={0};
FILE *pipe = _popen(cmd,"r");
int i = 0;
char c;
if(!pipe)
return -1;
while(!feof(pipe)){
if(fread(&c,1,1,pipe)==1){

result[i++]=c;

if(c==0)

break;

}
}
result[i]=0;
_pclose(pipe);
return 0;
}
输入一个命令,得到的是打印在result中
我调用的是adb命令,如果在cmd界面执行 adb start-server,在本程序执行“adb devices”没问题。
如果先kill server,再本程序执行adb start-server,则读pipe可以读到cmd命令下同样的打印,只是到最后一个字符(换行符)之后,就永久停留在fread语句中。此时在cmd界面,执行adb kill-server,程序又活了。求问怎么破解这个局
没什么分,全给了,以后有分了可以再追加,拜托
补充下是win32系统下,
问题的关键似乎是为什么读的时候读不到结束符,管道另外一边不放手,也不写,所以读的这一边吊在这里,所以一旦kill server,就释放了,程序就活了,不然就吊死在那里,求问可有什么办法解决这种吊死的情况
展开
 我来答
  • 你的回答被采纳后将获得:
  • 系统奖励15(财富值+成长值)+难题奖励10(财富值+成长值)+提问者悬赏5(财富值+成长值)
White_MouseYBZ
推荐于2017-11-27 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6677万
展开全部
起码你的代码有一个漏洞:第一次进入while时,!feof(pipe)是在判断谁?说明你对feof()这个函数并没有掌握,它必须在逻辑上“紧跟”在读文件动作之后才能正确生效,这第一次是“紧跟”在哪个读动作之后?到了文件结尾处就更可笑了:经while(!feof(pipe))判断文件还没有结束,比如说文件中还剩一个最后的'\n',可是体中的if(fread(&c,1,1,pipe)==1)中的fread函数还能读到什么?细节我就不说了,太长。建议把
while(!feof(pipe)){
if(fread(&c,1,1,pipe)==1){
result[i++]=c;
if(c==0)
break;
}
}
这一段改成
while(fread(&c,1,1,pipe),!feof(pipe)){
result[i++]=c;
//if(c==0)//这两句考虑一下吧,文件中有0吗?不可能有0,所以逻辑就有问题,建议删除
//break;
}
一试。
这里有一点好多网友没弄清,那就是feof()函数本身不读文件,只检查最近一次读动作越界(跨过文件结束符读)了没有。可续问。
追问
这里的关键是本来大部分命令都可以正常运行,唯独在某个情况下不行,似乎pipe一直没出现EOF标志,我一开始还用fgets试过,都一样
这个修改我也试过了,一样的现象
文件中读到最后确实剩余了一个“\n",是一个额外空行的换行符,读完这个之后,feof判断文件没读到末尾,这时候继续用fread或者fgets,都直接挂在这里的,读不到东西,也释放不了
追答
把你的命令文件内容传过来一些,我给你做。按我改的,不可能有你追问中说的情况……
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式