diff options
-rw-r--r-- | misc/inherited-fds.ninja | 23 | ||||
-rw-r--r-- | src/subprocess.cc | 1 |
2 files changed, 24 insertions, 0 deletions
diff --git a/misc/inherited-fds.ninja b/misc/inherited-fds.ninja new file mode 100644 index 0000000..671155e --- /dev/null +++ b/misc/inherited-fds.ninja @@ -0,0 +1,23 @@ +# This build file prints out a list of open file descriptors in +# Ninja subprocesses, to help verify we don't accidentally leak +# any. + +# Because one fd leak was in the code managing multiple subprocesses, +# this test brings up multiple subprocesses and then dumps the fd +# table of the last one. + +# Use like: ./ninja -f misc/inherited-fds.ninja + +rule sleep + command = sleep 10000 + +rule dump + command = sleep 1; ls -l /proc/self/fd; exit 1 + +build all: phony a b c d e + +build a: sleep +build b: sleep +build c: sleep +build d: sleep +build e: dump diff --git a/src/subprocess.cc b/src/subprocess.cc index 4426da0..65322a6 100644 --- a/src/subprocess.cc +++ b/src/subprocess.cc @@ -42,6 +42,7 @@ bool Subprocess::Start(SubprocessSet* set, const string& command) { if (pipe(output_pipe) < 0) Fatal("pipe: %s", strerror(errno)); fd_ = output_pipe[0]; + SetCloseOnExec(fd_); pid_ = fork(); if (pid_ < 0) |