读取 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 )
我一直在开发一个在 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 )