< prev index next >

src/hotspot/os/linux/os_linux.cpp

Print this page

        

*** 5765,5774 **** --- 5765,5829 ---- return status; } } } + + // Run the specified command in a separate process. Return its exit value, + // or -1 on failure (e.g. can't fork a new process). + // Unlike system(), this function can be called from signal handler. It + // doesn't block SIGINT et al. + int os::vfork_and_exec(char* cmd) { + const char * argv[4] = {"sh", "-c", cmd, NULL}; + + pid_t pid = vfork(); + + if (pid < 0) { + // fork failed + return -1; + + } else if (pid == 0) { + // child process + + execve("/bin/sh", (char* const*)argv, environ); + + // execve failed + _exit(-1); + + } else { + // copied from J2SE ..._waitForProcessExit() in UNIXProcess_md.c; we don't + // care about the actual exit code, for now. + + int status; + + // Wait for the child process to exit. This returns immediately if + // the child has already exited. */ + while (waitpid(pid, &status, 0) < 0) { + switch (errno) { + case ECHILD: return 0; + case EINTR: break; + default: return -1; + } + } + + if (WIFEXITED(status)) { + // The child exited normally; get its exit code. + return WEXITSTATUS(status); + } else if (WIFSIGNALED(status)) { + // The child exited because of a signal + // The best value to return is 0x80 + signal number, + // because that is what all Unix shells do, and because + // it allows callers to distinguish between process exit and + // process death by signal. + return 0x80 + WTERMSIG(status); + } else { + // Unknown exit code; pass it through + return status; + } + } + } + // Get the default path to the core file // Returns the length of the string int os::get_core_path(char* buffer, size_t bufferSize) { /* * Max length of /proc/sys/kernel/core_pattern is 128 characters.
< prev index next >