When I run this programm, I always get exitCode == 255. $ java -version java version "1.6.0_01-p1" Java(TM) SE Runtime Environment (build 1.6.0_01-p1-root_12_aug_2007_22_50-b00) Java HotSpot(TM) Client VM (build 1.6.0_01-p1-root_12_aug_2007_22_50-b00, mixed mode) $ uname -a FreeBSD ronald.office.base.nl 6.2-STABLE FreeBSD 6.2-STABLE #74: Sat Jul 14 13:11:40 CEST 2007 root@ronald.office.base.nl:/usr/obj/usr/src/sys/RONALD i386 I found it with other code, but this is my small testcase to reproduce it. How-To-Repeat: Compile and run this java programm. import java.io.IOException; final class ExecTest { public static void main(String[] args) throws IOException, InterruptedException { Runtime rt = Runtime.getRuntime(); Process p = rt.exec("/bin/ls"); int exitCode = p.waitFor(); System.out.println("ExitCode: " + exitCode); } }
Responsible Changed From-To: freebsd-java->glewis I'll take it.
In jdk 1.6 there is some magic performed via file descriptor 3 in j2se/src/solaris/native/java/lang/UNIXProcess_md.c that was not in jdk15. The problem is that the closeDescriptors() function in the patchset was not updated to take this into account. diff -ur bsd-jdk16-patches-1.orig/jdk16.patches bsd-jdk16-patches-1/jdk16.patches --- bsd-jdk16-patches-1.orig/jdk16.patches 2007-07-24 09:05:48.000000000 +0200 +++ bsd-jdk16-patches-1/jdk16.patches 2007-08-27 20:44:20.000000000 +0200 @@ -80764,7 +80764,7 @@ +static int +closeDescriptors(void) +{ -+ return _thread_sys_closefrom(3); ++ return _thread_sys_closefrom(FAIL_FILENO + 1); +} + +#elif defined(_ALLBSD_SOURCE) @@ -80782,7 +80782,7 @@ + /* + * BSDNOTE: There's no known way to find list of all open file descriptors + * associated with process in FreeBSD. Therefore we have to pass from -+ * fd == 3 to maximum fd per process number. It's possible to retrive ++ * fd == FAIL_FILENO + 1 to maximum fd per process number. It's possible to retrive + * max number of fd's with three ways: sysctl(kern.maxfilesperproc), + * getrlimit(RLIMIT_NOFILE) and getdtablesize(). In current implementation + * getdtablesize() returns MIN() of first two ways. @@ -80797,7 +80797,7 @@ + max_fd = getdtablesize(); + ebadf = 0; + -+ for (i = 3; i < max_fd; i++) { ++ for (i = FAIL_FILENO + 1; i < max_fd; i++) { + if (close(i) < 0) { ebadf++; } else { ebadf = 0; } + /* + * GUESS_FINISHED subsequent calls to close() returned EBADF, assume
glewis 2007-08-28 15:24:32 UTC FreeBSD ports repository Modified files: java/jdk16 Makefile Added files: java/jdk16/files patch-j2se-lang-UNIXProcess_md.c Log: . Sync the BSD specific code with the changes between 1.5 and 1.6 and start closing file descriptors at FAIL_FILENO + 1 rather than 3. This fixes the problem with determining the exit code for exec()'ed processes. PR: 115557 Submitted by: Michiel Boland <michiel@boland.org> Revision Changes Path 1.144 +1 -1 ports/java/jdk16/Makefile 1.1 +31 -0 ports/java/jdk16/files/patch-j2se-lang-UNIXProcess_md.c (new) _______________________________________________ cvs-all@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/cvs-all To unsubscribe, send any mail to "cvs-all-unsubscribe@freebsd.org"
State Changed From-To: open->closed Thanks, Michiel! I've committed your patch.