Use _exit rather than exit in the child process after a failed exec.

Add a comment explaining why.

llvm-svn: 78128
This commit is contained in:
Dan Gohman 2009-08-05 00:09:12 +00:00
parent 337b124a24
commit 23a419f361
1 changed files with 7 additions and 3 deletions

View File

@ -200,9 +200,13 @@ Program::Execute(const Path& path,
execve(path.c_str(), (char**)args, (char**)envp);
else
execv(path.c_str(), (char**)args);
// If the execve() failed, we should exit and let the parent pick up
// our non-zero exit status.
exit(errno == ENOENT ? 127 : 126);
// If the execve() failed, we should exit. Follow Unix protocol and
// return 127 if the executable was not found, and 126 otherwise.
// Use _exit rather than exit so that atexit functions and static
// object destructors cloned from the parent process aren't
// redundantly run, and so that any data buffered in stdio buffers
// cloned from the parent aren't redundantly written out.
_exit(errno == ENOENT ? 127 : 126);
}
// Parent process: Break out of the switch to do our processing.