读取 popen() 时如何修复 fgets() 挂起?

How to fix fgets() hanging when reading popen()?

我一直在开发一个在 JNI 中执行其功能的 Android 应用程序。我的问题出在 logcat 显示直到按下按钮的函数中。我找到了问题发生的地方:

FILE *logcat = popen("su -c logcat threadtime", "r");

while (isRunning(running, env, thiz))
    if (fgets(&line, sizeof(line), logcat) != NULL) //<--- HERE
        appendLogWithToken(logger, line, env, thiz);

我进行了一些调试,发现 fgets() 会休眠直到收到另一行。我搜索并找到了类似的问题,但没有有效的答案。是否还有其他函数 return 为 null 并且不等待输入,或者这个可以修复吗?

Jonathan 很好地解释了为什么会发生这种情况。

针对您的情况,一个简单的解决方法是使用 logcat -d。 添加 -d 选项将在当前缓冲区的末尾发送 EOF 并允许 fgets 继续(而不是监视缓冲区的默认选项 endleslly )