JNA调用getrlimit()获取RLIMIT_NOFILE返回错误值,疑似Bug?
问题分析与解决
你遇到的不是JNA功能异常,而是常量定义不匹配导致的问题——JNA的Resource类中RLIMIT_NOFILE和RLIMIT_NPROC的常量值,和macOS 12.6系统实际定义的数值不匹配,导致调用getrlimit时传错了参数,拿到了进程数的限制值而非文件数。
验证方法
先通过C代码确认系统实际的常量值:
#include <sys/resource.h> #include <stdio.h> int main() { printf("RLIMIT_NOFILE: %d\n", RLIMIT_NOFILE); printf("RLIMIT_NPROC: %d\n", RLIMIT_NPROC); return 0; }
编译运行(gcc test.c -o test && ./test),将得到的数值和JNAResource类中对应常量的值对比,就能发现不匹配的问题。
解决办法
- 手动指定正确的常量值:把代码中
Resource.RLIMIT_NOFILE替换为C程序输出的正确数值,比如如果实际RLIMIT_NOFILE是7,就直接传7调用getrlimit。 - 升级JNA版本:较新版本的JNA已经修复了不同平台下的常量定义问题,更新到最新稳定版后,直接使用
Resource.RLIMIT_NOFILE即可得到正确结果。
代码修正示例(手动指定常量值)
假设C程序输出RLIMIT_NOFILE为7,修改后的代码:
public interface CLibrary extends LibCAPI, Library { CLibrary INSTANCE = Native.load("c", CLibrary.class); } public class Main { public static void main(String[] args) { final CLibrary INSTANCE = Native.load("c", CLibrary.class); final Resource.Rlimit rlimit = new Resource.Rlimit(); // 用系统实际的RLIMIT_NOFILE常量值替换 INSTANCE.getrlimit(7, rlimit); System.out.println(rlimit.rlim_max); System.out.println(rlimit.rlim_cur); } }
内容的提问来源于stack exchange,提问作者stackseti
相关产品推荐
相关产品推荐

