linux popen卡在了fgets上

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux popen卡在了fgets上相关的知识,希望对你有一定的参考价值。

伙计们!我使用popen函数在linux上执行shell脚本(ubuntu16.04)。

char buffer[1024];
char cmd[1024];
snprintf(cmd, 1024, "./vm_manager.sh start %s %d %d", vm_name, vm_start_port, vm_start_core);

FILE *fp = popen(cmd, "r");

while(fgets(buffer, sizeof(buffer), fp) != NULL){
    printf("%s", buffer);
    fflush(stdout);
}   
printf("over=============");
pclose(fp);

在vm_manager.sh中,只需运行一个android模拟器cmd即可启动如下所示的avd:

emulator -avd $VM_NAME -kernel $KERNEL -port $VM_START_PORT -no-window -writable-system -ranchu -cores 4 -gpu mesa &

实际上它会注销模拟器启动日志,但是卡在fgets上并且永远不会打印出“over ===”。

感谢任何建议!

答案

我通过在shell脚本中添加end_flag解决了这个问题:

echo "START_SUCCESS"

然后在c ++中检查end_flag是否显示。如果出现,只需打破fgets循环:

while(fgets(buffer, sizeof(buffer), fp) != NULL){
    printf("%s", buffer);
    fflush(stdout);
    if(strcmp(buffer, "START_SUCCESS
") == 0){ 
        break;
    }   
}   

无论如何,谢谢。

以上是关于linux popen卡在了fgets上的主要内容,如果未能解决你的问题,请参考以下文章

如何解决fgets读取popen内容阻塞的问题

deepin安装时卡在了安装界面

如何停止 fgets 从 FIFO 文件中读取

在VMware上安装了kali linux,之后打开相应的虚拟机,可是启动后就卡在了安装这个页面?

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

windows和Linux程序读取命令输出信息