Skip to content

Commit

Permalink
process: add example for reading Child stdout (#7141)
Browse files Browse the repository at this point in the history
  • Loading branch information
maminrayej authored Feb 8, 2025
1 parent 7e27911 commit 8713d39
Showing 1 changed file with 42 additions and 0 deletions.
42 changes: 42 additions & 0 deletions tokio/src/process/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1169,6 +1169,8 @@ impl Child {
///
/// This is equivalent to sending a `SIGKILL` on unix platforms.
///
/// # Examples
///
/// If the child has to be killed remotely, it is possible to do it using
/// a combination of the select! macro and a `oneshot` channel. In the following
/// example, the child will run until completion unless a message is sent on
Expand All @@ -1190,6 +1192,46 @@ impl Child {
/// }
/// }
/// ```
///
/// You can also interact with the child's standard I/O. For example, you can
/// read its stdout while waiting for it to exit.
///
/// ```no_run
/// # use std::process::Stdio;
/// #
/// # use tokio::io::AsyncReadExt;
/// # use tokio::process::Command;
/// # use tokio::sync::oneshot::channel;
///
/// #[tokio::main]
/// async fn main() {
/// let (_tx, rx) = channel::<()>();
///
/// let mut child = Command::new("echo")
/// .arg("Hello World!")
/// .stdout(Stdio::piped())
/// .spawn()
/// .unwrap();
///
/// let mut stdout = child.stdout.take().expect("stdout is not captured");
///
/// let read_stdout = tokio::spawn(async move {
/// let mut buff = Vec::new();
/// let _ = stdout.read_to_end(&mut buff).await;
///
/// buff
/// });
///
/// tokio::select! {
/// _ = child.wait() => {}
/// _ = rx => { child.kill().await.expect("kill failed") },
/// }
///
/// let buff = read_stdout.await.unwrap();
///
/// assert_eq!(buff, b"Hello World!\n");
/// }
/// ```
pub async fn kill(&mut self) -> io::Result<()> {
self.start_kill()?;
self.wait().await?;
Expand Down

0 comments on commit 8713d39

Please sign in to comment.