diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2022-12-17 23:44:26 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-12-17 23:44:26 +0100 |
| commit | 6d1cdcaee52e357dfb3500091bdd18a2e0c763ff (patch) | |
| tree | 8c77db364a89edb08e1552ac86b4d74a6baae5a1 /library/std/src/sys/unix/process/process_unix.rs | |
| parent | 5dc0b6ff6d76cefa32b1393800067c743f163dcc (diff) | |
| parent | a94793d8d17e4cfe2e727c30c36e174b8d6b6ee3 (diff) | |
| download | rust-6d1cdcaee52e357dfb3500091bdd18a2e0c763ff.tar.gz rust-6d1cdcaee52e357dfb3500091bdd18a2e0c763ff.zip | |
Rollup merge of #105458 - Ayush1325:blocking_spawn, r=Mark-Simulacrum
Allow blocking `Command::output` ### Problem Currently, `Command::output` is internally implemented using `Command::spawn`. This is problematic because some targets (like UEFI) do not actually support multitasking and thus block while the program is executing. This coupling does not make much sense as `Command::output` is supposed to block until the execution is complete anyway and thus does not need to rely on a non-blocking `Child` or any other intermediate. ### Solution This PR moves the implementation of `Command::output` to `std::sys`. This means targets can choose to implement only `Command::output` without having to implement `Command::spawn`. ### Additional Information This was originally conceived when working on https://github.com/rust-lang/rust/pull/100316. Currently, the only target I know about that will benefit from this change is UEFI. This PR can also be used to implement more efficient `Command::output` since the intermediate `Process` is not actually needed anymore, but that is outside the scope of this PR. Since this is not a public API change, I'm not sure if an RFC is needed or not.
Diffstat (limited to 'library/std/src/sys/unix/process/process_unix.rs')
| -rw-r--r-- | library/std/src/sys/unix/process/process_unix.rs | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/library/std/src/sys/unix/process/process_unix.rs b/library/std/src/sys/unix/process/process_unix.rs index c0716a089bc..39d1c8b1d8e 100644 --- a/library/std/src/sys/unix/process/process_unix.rs +++ b/library/std/src/sys/unix/process/process_unix.rs @@ -133,6 +133,11 @@ impl Command { } } + pub fn output(&mut self) -> io::Result<(ExitStatus, Vec<u8>, Vec<u8>)> { + let (proc, pipes) = self.spawn(Stdio::MakePipe, false)?; + crate::sys_common::process::wait_with_output(proc, pipes) + } + // Attempts to fork the process. If successful, returns Ok((0, -1)) // in the child, and Ok((child_pid, -1)) in the parent. #[cfg(not(target_os = "linux"))] |
