从Java启动一个子进程,它不会';t在UNIX上继承文件/端口

从Java启动一个子进程,它不会';t在UNIX上继承文件/端口,java,ports,inheritance,Java,Ports,Inheritance,这个问题和我搜索的类似 然而,在我的例子中,我想从Java启动一个子进程,它不会从父进程(JVM)继承文件/端口。这在Java中可能吗?有解决办法吗 从我收集到的信息来看,Java似乎没有提供一种使用close-on-exec标志(FD_-CLOEXEC)标记文件描述符的方法,这与C不同。任何见解都将不胜感激 谢谢 在Java中打开的任何文件都会自动标记为FD_CLOEXEC。如果在strace中运行JVM,您将看到与FileInputStream相对应的输出。open调用: 5926 ope

这个问题和我搜索的类似

然而,在我的例子中,我想从Java启动一个子进程,它不会从父进程(JVM)继承文件/端口。这在Java中可能吗?有解决办法吗

从我收集到的信息来看,Java似乎没有提供一种使用close-on-exec标志(FD_-CLOEXEC)标记文件描述符的方法,这与C不同。任何见解都将不胜感激


谢谢

在Java中打开的任何文件都会自动标记为FD_CLOEXEC。如果在
strace
中运行JVM,您将看到与
FileInputStream相对应的输出。open
调用:

5926  open("file.txt", O_RDONLY|O_LARGEFILE) = 6                                                                         
5926  fstat64(6, {st_mode=S_IFREG|0664, st_size=869, ...}) = 0
5926  fcntl64(6, F_GETFD)               = 0
5926  fcntl64(6, F_SETFD, FD_CLOEXEC)   = 0

如果您检查了OpenJDK源代码,我相信您会在
open

之后立即找到一个
fcntl
调用,您使用的是哪个平台?启动子进程时继承句柄的语义在Windows和POSIX之间有很大不同。Java和JVM的可能重复都没有描述继承文件句柄的任何语义(因为行为依赖于系统)。因此,当您删除问题的Java部分时,它与您链接到的类似部分相同。有关更多信息,请参见。