C 如何修复读取popen()时fgets()挂起的问题?
我一直在开发一款Android应用程序,它在JNI中运行。我的问题是,logcat在按下按钮之前一直显示。我发现问题发生的地方:C 如何修复读取popen()时fgets()挂起的问题?,c,java-native-interface,C,Java Native Interface,我一直在开发一款Android应用程序,它在JNI中运行。我的问题是,logcat在按下按钮之前一直显示。我发现问题发生的地方: FILE *logcat = popen("su -c logcat threadtime", "r"); while (isRunning(running, env, thiz)) if (fgets(&line, sizeof(line), logcat) != NULL) //<--- HERE appendLogWith
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);
FILE*logcat=popen(“su-c logcat threadtime”,“r”);
同时(正在运行(运行、环境、thiz))
if(fgets(&line,sizeof(line),logcat)!=NULL)/Jonathan对为什么会发生这种情况给出了极好的解释
对于您的情况,一个简单的修复方法是使用logcat-d。
添加-d选项将在当前缓冲区的末尾发送EOF,并允许fgets继续(而不是从一端监视缓冲区的默认选项)fgets()
reads('hangs'),直到它获得EOF(没有更多数据且管道的写入端关闭)或直到更多数据到达为止-这就是设计。logcat
正在退出,还是永久挂起?如果您想要非阻塞I/O,可以在底层文件描述符上使用fcntl()
,使管道成为非阻塞的,但是您需要知道自己在做什么(clearr()
成为朋友)。我怀疑你有一些设计缺陷,或者你没有仔细考虑。您不显示pclose(logcat)代码>,例如-什么时候关闭该文件?首先用“if(logcat!=NULL)”检查logcat是否打开,它会变脏,但我会首先使用fileno(3)
获取文件描述符,然后调用select(2)
或poll(2)
检查是否有数据。然后是一个非行分隔符,它期望像read(2)
这样的read函数实际读取数据。这只是代码的一部分。我没有包括所有的函数调用。它会阻塞直到收到另一行。