Dan, I had a question on this comment.
Should we fix this in hotspot? So you mention recent Linux open() documentation. How does this behave on Solaris and Mac? I assume the library code is shared code across platforms. Also - what is the oldest Linux we support for JDK8? thanks, Karen On Jan 29, 2013, at 6:55 AM, Alan Bateman wrote: > >> >>> >>> - I don't think the O_CLOEXEC code is needed in handleOpen, was this copied >>> from HotSpot? >> In the original hotspot code, it has one section to enable the close-on-exec >> flag for the new file descriptor as the following. >> >> #ifdef FD_CLOEXEC >> { >> int flags = ::fcntl(fd, F_GETFD); >> if (flags != -1) >> ::fcntl(fd, F_SETFD, flags | FD_CLOEXEC); >> } >> #endif >> >> According to the comment, "All file descriptors that are opened in the JVM >> and not specifically destined for a subprocess should have the close-on-exec >> flag set. If we don't set it, then careless 3rd party native code might >> fork and exec without closing all appropriate file descriptors (e.g. as we >> do in closeDescriptors in UNIXProcess.c), and this in turn might: >> - cause end-of-file to fail to be detected on some file descriptors, >> resulting in mysterious hangs, or >> - might cause an fopen in the subprocess to fail on a system suffering >> from bug 1085341." >> >> And the recent open() function (since Linux 2.6.23) already has O_CLOSEXEC >> flag to enable this flag by default. And it is a preferred way according to >> the man page, " Specifying this flag permits a program to avoid >> additional fcntl(2) F_SETFD operations to set the FD_CLOEXEC flag. >> Addi-tionally, use of this flag is essential in some multithreaded programs >> since using a separate fcntl(2) F_SETFD operation to set the FD_CLOEXEC >> flag does not suffice to avoid race conditions where one thread opens a file >> descriptor at the same time as another thread does a fork(2) plus >> execve(2). >> Additionally, if O_CLOEXEC is not supported, F_DUPFD_CLOEXEC is preferred >> than FD_CLOEXEC, which is what hotspot is using right now. > I don't think we need this because the file descriptor will be closed at exec > time anyway (there is logic in Runtime.exec to iterate over the file > descriptors and close them). Also we don't do this in other areas of the > platform where we use open directly. > >>