X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FSubprocess.cpp;h=c17e8849e8f080a2a722b84a35b5317a6a68b2df;hb=fd915b73606e09a5f46a1bca0a5d3643a1567014;hp=ac8eab60d7a1423c8db0af85ef0b0998885c870b;hpb=217e88e6a6f011a6cc4d44490b319f919574a620;p=folly.git diff --git a/folly/Subprocess.cpp b/folly/Subprocess.cpp index ac8eab60..c17e8849 100644 --- a/folly/Subprocess.cpp +++ b/folly/Subprocess.cpp @@ -39,7 +39,6 @@ #include #include -#include #include #include #include @@ -256,29 +255,25 @@ void Subprocess::spawn( // in case it fails before calling exec() int errFds[2]; #if FOLLY_HAVE_PIPE2 - int r = ::pipe2(errFds, O_CLOEXEC); + checkUnixError(::pipe2(errFds, O_CLOEXEC), "pipe2"); #else - int r = ::pipe(errFds); + checkUnixError(::pipe(errFds), "pipe"); #endif - checkUnixError(r, "pipe"); SCOPE_EXIT { CHECK_ERR(::close(errFds[0])); if (errFds[1] >= 0) { CHECK_ERR(::close(errFds[1])); } }; - // Ask the child to close the read end of the error pipe. - options.fdActions_[errFds[0]] = CLOSE; #if !FOLLY_HAVE_PIPE2 - r = fcntl(errFds[0], F_SETFD, FD_CLOEXEC); - checkUnixError(r, "set FD_CLOEXEC"); + // Ask the child to close the read end of the error pipe. + checkUnixError(fcntl(errFds[0], F_SETFD, FD_CLOEXEC), "set FD_CLOEXEC"); // Set the close-on-exec flag on the write side of the pipe. // This way the pipe will be closed automatically in the child if execve() // succeeds. If the exec fails the child can write error information to the // pipe. - r = fcntl(errFds[1], F_SETFD, FD_CLOEXEC); - checkUnixError(r, "set FD_CLOEXEC"); + checkUnixError(fcntl(errFds[1], F_SETFD, FD_CLOEXEC), "set FD_CLOEXEC"); #endif // Perform the actual work of setting up pipes then forking and @@ -454,12 +449,9 @@ int Subprocess::prepareChild(const Options& options, } } - // Close parent's ends of all pipes - for (auto& p : pipes_) { - if (::close(p.parentFd) == -1) { - return errno; - } - } + // We don't have to explicitly close the parent's end of all pipes, + // as they all have the FD_CLOEXEC flag set and will be closed at + // exec time. // Close all fds that we're supposed to close. for (auto& p : options.fdActions_) { @@ -501,7 +493,6 @@ int Subprocess::runChild(const char* executable, char** argv, char** env, const Options& options) const { // Now, finally, exec. - int r; if (options.usePath_) { ::execvp(executable, argv); } else { @@ -826,4 +817,3 @@ Initializer initializer; } // namespace } // namespace folly -