Add process group leader option
[folly.git] / folly / Subprocess.cpp
index 11bbc3f7bd6e62fca06ece47ac9b4df570424d44..8de5d36979b8e28b1d3cf260cd66083cc9d8b6b3 100644 (file)
@@ -289,6 +289,14 @@ void Subprocess::spawn(
   // child has exited and can be immediately waited for.  In all other cases,
   // we have no way of cleaning up the child.
 
+  if (options.processGroupLeader_) {
+    // This is done both in the parent and the child to avoid the race where
+    // the parent assumes that the child is a leader, but the child has not
+    // yet run setprp().  Not checking error codes since we're deliberately
+    // racing the child, which may already have run execve(), and expect to
+    // lose frequently.
+    setpgid(pid_, pid_);
+  }
   // Close writable side of the errFd pipe in the parent process
   CHECK_ERR(::close(errFds[1]));
   errFds[1] = -1;
@@ -486,6 +494,12 @@ int Subprocess::prepareChild(const Options& options,
   }
 #endif
 
+  if (options.processGroupLeader_) {
+    if (setpgrp() == -1) {
+      return errno;
+    }
+  }
+
   return 0;
 }