我正在尝试使用Java应用程序的Linux功能。我不想为解释器(JVM)添加功能,所以我尝试编写一个简单的包装器(将调试信息打印到stdout):
#include <stdio.h>
#include <stdlib.h>
#include <sys/capability.h>
#include <unistd.h>
int main(int argc, char *argv[]){
cap_t cap = cap_get_proc();
if (!cap) {
perror("cap_get_proc");
exit(1);
}
printf("%s: running with caps %s\n", argv[0], cap_to_text(cap, NULL));
return execlp("/usr/bin/java", "-server", "-jar", "project.jar", (char *)NULL);
}
这样,我可以看到为此可执行文件设置了功能:
./runner: running with caps = cap_net_bind_service+p
getcap
显示
runner = cap_net_bind_service+ip
我将功能设置为可继承,因此应该没有问题。但是,java仍然不想绑定到特权端口。
我收到此错误:
sun/nio/ch/Net.java:-2:in `bind': java.net.SocketException: Permission denied (NativeException)
有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
尝试使用1024以上的端口,或以root身份运行。
答案 1 :(得分:0)
任何更新?
您可以在Apache Commons-Daemon jsvc项目中找到一些答案:“......用于使Java应用程序在UNIX上运行的一组库和应用程序更容易。”
他们使用功能,即使他们不允许用户选择应用哪个功能,我认为是出于便携性原因。