Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何修复读取popen()时fgets()挂起的问题?_C_Java Native Interface - Fatal编程技术网

C 如何修复读取popen()时fgets()挂起的问题?

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

我一直在开发一款Android应用程序,它在JNI中运行。我的问题是,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);
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函数实际读取数据。这只是代码的一部分。我没有包括所有的函数调用。它会阻塞直到收到另一行。