< prev index next >
src/os/linux/vm/os_linux.cpp
Print this page
*** 5927,5975 ****
}
extern char** environ;
- #ifndef __NR_fork
- #define __NR_fork IA32_ONLY(2) IA64_ONLY(not defined) AMD64_ONLY(57)
- #endif
-
- #ifndef __NR_execve
- #define __NR_execve IA32_ONLY(11) IA64_ONLY(1033) AMD64_ONLY(59)
- #endif
-
// 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::fork_and_exec(char* cmd) {
const char * argv[4] = {"sh", "-c", cmd, NULL};
! // fork() in LinuxThreads/NPTL is not async-safe. It needs to run
! // pthread_atfork handlers and reset pthread library. All we need is a
! // separate process to execve. Make a direct syscall to fork process.
! // On IA64 there's no fork syscall, we have to use fork() and hope for
! // the best...
! pid_t pid = NOT_IA64(syscall(__NR_fork);)
! IA64_ONLY(fork();)
if (pid < 0) {
// fork failed
return -1;
} else if (pid == 0) {
// child process
! // execve() in LinuxThreads will call pthread_kill_other_threads_np()
! // first to kill every thread on the thread list. Because this list is
! // not reset by fork() (see notes above), execve() will instead kill
! // every thread in the parent process. We know this is the only thread
! // in the new process, so make a system call directly.
! // IA64 should use normal execve() from glibc to match the glibc fork()
! // above.
! NOT_IA64(syscall(__NR_execve, "/bin/sh", argv, environ);)
! IA64_ONLY(execve("/bin/sh", (char* const*)argv, environ);)
// execve failed
_exit(-1);
} else {
--- 5927,5953 ----
}
extern char** environ;
// 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::fork_and_exec(char* cmd) {
const char * argv[4] = {"sh", "-c", cmd, NULL};
! pid_t pid = fork();
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 {
< prev index next >