2010-06-14 60 views
6

我正在试验Java应用程序的Linux功能。我不想来增加功能,以解释器(JVM),所以我试着写一个简单的包装(带打印到标准输出的调试信息):功能与Linux和Java

#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

“java仍然不想绑定到特权端口”:你会得到什么错误信息?在尝试绑定到特权端口之前,您的JRE实现可能会对“uid == 0”进行自己的(错误)检查。 – 2010-06-14 11:40:27

回答

1

尝试使用1024以上的端口,或者以超级用户身份运行。

+1

1024以下的端口是有特权的,只能由root访问。 – 2011-10-08 03:20:41

0

有没有更新?

您可以在Apache Commons-Daemon jsvc项目中找到一些答案:“...用于使Java应用程序更容易在UNIX上运行的库和应用程序集。”

他们使用的能力,即使他们没有允许用户选择应用哪一个,对于便携性的原因,我想。