From a152f8a1731acb1b5aef9878ee25418adb4338c4 Mon Sep 17 00:00:00 2001 From: Thomas Orozco Date: Wed, 2 Feb 2022 19:52:26 +0000 Subject: [PATCH] Add a `process_group` method to UNIX `CommandExt` --- text/0000-process-process_group.md | 87 ++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 text/0000-process-process_group.md diff --git a/text/0000-process-process_group.md b/text/0000-process-process_group.md new file mode 100644 index 00000000000..3945c36a051 --- /dev/null +++ b/text/0000-process-process_group.md @@ -0,0 +1,87 @@ +- Feature Name: `process_set_process_group` +- Start Date: 03-02-2022 +- RFC PR: [rust-lang/rfcs#0000](https://github.com/rust-lang/rfcs/pull/0000) +- Rust Issue: [rust-lang/rust#0000](https://github.com/rust-lang/rust/issues/0000) + +# Summary +[summary]: #summary + +Add a `process_group` method to `std::os::unix::process::CommandExt` that +allows setting the process group id (i.e. calling `setpgid`) in the child, thus +enabling users to set process groups while leveraging the `posix_spawn` fast +path. + +# Motivation +[motivation]: #motivation + +The Unix process spawn code has two paths: a fast path that uses `posix_spawn`, +and a slow path that uses `fork` and `exec`. + +The performance between the two APIs has been shown to be very noticeable: + +https://github.com/rust-lang/rust/commit/8fe61546696b626ecf68ef838d5d82e393719e80 + +Currently, users can set the process group on the commands they spawn via: + +``` +let pre_exec = || nix::unistd::setpgid( ... ); +unsafe { + cmd.pre_exec(pre_exec) +}; +``` + +This approach forces the slow path because of the usage of `pre_exec`. + +However, `posix_spawn` supports setting the process group +(`posix_spawnattr_setpgroup`), this RFC proposes exposing that functionality, +which allows users to set the process group id without forcing the slow path. + +# Guide-level explanation +[guide-level-explanation]: #guide-level-explanation + +`std::os::unix::process::CommandExt::process_group` allows you to set the +process group ID of the child process. This translates to a `setpgid` call +in the child. + +# Reference-level explanation +[reference-level-explanation]: #reference-level-explanation + +The two changes needed are: + +- Expose a `CommandExt` a `process_group` method on `CommandExt` that takes a + PID as argument. +- Add a call to `posix_spawnattr_setpgroup` on the fast path. +- Add a call to `setpgid` on the slow path. + +# Drawbacks +[drawbacks]: #drawbacks + +This marginally expands the API surface on `CommandExt`. + +# Rationale and alternatives +[rationale-and-alternatives]: #rationale-and-alternatives + +- Using `pre_exec` this is a viable alternative for programs where `fork` is + either sufficiently fast or infrequent. +- Not using `std::process`, and rolling your own instead, is an alternative. + This would however break interoperability with e.g. Tokio's + `tokio::process::Command`, which currently can be created using the a + `Command` from the std lib. + +# Prior art +[prior-art]: #prior-art + +The primary prior art here is all the other calls that already exist on +`CommandExt` that translate to parameterizing `posix_spawn`, such as +configuring groups, signal mask, current working directory, open pipes. + +# Unresolved questions +[unresolved-questions]: #unresolved-questions + +- None known at this point. + +# Future possibilities +[future-possibilities]: #future-possibilities + +There are a few other `posix_spawn` options that are not supported, such as +`setsid` (which is a GNU extension). Those might warrant inclusion as well.