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

时间:2015-04-04 20:47:38

标签: c java-native-interface

我一直致力于在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()会一直睡到收到另一行。我搜索过并发现了类似的问题,但没有合适的答案。是否还有其他函数返回null并且不等待输入,或者这是否可以修复?

1 个答案:

答案 0 :(得分:0)

Jonathan给出了一个很好的解释,说明为什么会这样。

您的案例中的一个简单修复是使用logcat -d。 添加-d选项将在当前缓冲区的末尾发送EOF,并允许fgets继续(而不是默认选项监视缓冲区)