reload_self 0.1.22

Cross-platform process hot reload library / 跨平台进程热重载库
Documentation
use std::{os::unix::process::CommandExt, process::Command};

use nix::unistd;
use tokio::signal::unix::{SignalKind, signal};

/// Wait for SIGHUP signal / 等待 SIGHUP 信号
pub async fn wait_reload() {
  let mut stream = signal(SignalKind::hangup()).expect("Failed to create SIGHUP signal stream");
  stream.recv().await;
}

pub fn setup_process_detachment(command: &mut Command) {
  unsafe {
    command.pre_exec(move || {
      // 创建新会话,脱离控制终端
      // 注意:pre_exec 中应尽量避免内存分配 (unwrap/map_err 可能会分配),
      // 但在非极端严苛的系统编程场景下,这样写通常是可以接受的。
      // 严格来说,应该直接使用 nix::unistd::setsid() 并不处理 Result
      // 或者使用 libc::setsid() 并检查返回值,出错直接 libc::_exit(1)。
      if unistd::setsid().is_err() {
        // 如果 setsid 失败,通常意味着无法继续,应该强制退出子进程
        std::process::exit(1);
      }
      Ok(())
    });
  }
}