Child::kill
发送一个 SIGKILL
信号,但我如何发送其他信号,例如 SIGTERM
?我可能可以使用 libc
和其信号 API,但是否有更好的方法来实现这一点?
Child::kill
发送一个 SIGKILL
信号,但我如何发送其他信号,例如 SIGTERM
?我可能可以使用 libc
和其信号 API,但是否有更好的方法来实现这一点?
nix
库在提供UNIX底层操作的习惯用法的同时,也很好地处理了发送和处理信号的操作。在这种情况下,您可以从child_process.id()
创建一个nix::Pid
,然后将其传递给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();
pub fn kill_gracefully(child: &Child) { unsafe { libc::kill(child.id() as i32, libc::SIGTERM); } }
该函数使用libc,以优雅的方式杀死一个子进程。 - Alistairkill
kill
命令有许多选项,可以向进程发送不同的信号。
您可以使用.id()
获取child
进程的进程ID。
它可能是这样的:
let kill = Command::new("kill")
// TODO: replace `TERM` to signal you want.
.args(["-s", "TERM", &child.id().to_string()])
.spawn()?;
kill.wait()?;
libc
,配合一些特定于操作系统的代码路径。 - the8472SIGTERM
最接近的本地等效方式是WM_QUERYENDSESSION
+WM_ENDSESSION
,适用于GUI应用程序,而对于控制台应用程序,则使用GenerateConsoleCtrlEvent
。 - Francis Gagnékill
命令,而这正是发送信号的方式。C运行时库通过将某些本机操作系统事件转换为信号来模拟信号。应用程序只能通过调用raise
向自身发送SIGTERM
信号。然而,SIGINT
和SIGBREAK
可以从控制台控制事件中生成。 - Francis Gagné