如何向“子”子进程发送信号?

Ole*_*yan 7 rust

Child::kill发送SIGKILL,但是如何发送其他信号SIGTERM呢?我可能可以使用libc及其信号API,但是有更好的方法吗?

ecs*_*rse 15

nix库在为低级 UNIX 操作(包括发送和处理信号)提供惯用的 Rust 包装方面做得很好。在这种情况下,您将创建一个nix::Pidfrom child_process.id(),然后将其传递给kill像这样:

use nix::unistd::Pid;
use nix::sys::signal::{self, Signal};

// Spawn child process.
let mut child = std::process::Command::new();
/* build rest of command */
child.spawn().unwrap();

// Send SIGTERM to child process.
signal::kill(Pid::from_raw(child.id()), Signal::SIGTERM).unwrap();
Run Code Online (Sandbox Code Playgroud)

  • 对于那些只想使用 libc 的人: `pub fn Kill_graceously(child: &Child) { unsafe { libc::kill(child.id() as i32, libc::SIGTERM); } }` (12认同)

小智 6

使用kill

kill命令有很多选项可以向进程发送不同的信号。您可以child使用 获取该进程的进程 ID .id()

会是这样的

let kill = Command::new("kill")
    // TODO: replace `TERM` to signal you want.
    .args(["-s", "TERM", &child.id().to_string()])
    .spawn()?;
kill.wait()?;
Run Code Online (Sandbox Code Playgroud)