37 lines
1 KiB
Rust
37 lines
1 KiB
Rust
use std::{io, process};
|
|
|
|
// This code is from the open crate and retains its MIT license.
|
|
pub fn spawn_detached(command: &mut process::Command) -> io::Result<()> {
|
|
command
|
|
.stdin(process::Stdio::null())
|
|
.stdout(process::Stdio::null())
|
|
.stderr(process::Stdio::null());
|
|
|
|
#[cfg(unix)]
|
|
unsafe {
|
|
use std::os::unix::process::CommandExt as _;
|
|
|
|
command.pre_exec(move || {
|
|
match libc::fork() {
|
|
-1 => return Err(io::Error::last_os_error()),
|
|
0 => (),
|
|
_ => libc::_exit(0),
|
|
}
|
|
|
|
if libc::setsid() == -1 {
|
|
return Err(io::Error::last_os_error());
|
|
}
|
|
|
|
Ok(())
|
|
});
|
|
}
|
|
#[cfg(windows)]
|
|
{
|
|
use std::os::windows::process::CommandExt;
|
|
const CREATE_NEW_PROCESS_GROUP: u32 = 0x00000200;
|
|
const CREATE_NO_WINDOW: u32 = 0x08000000;
|
|
command.creation_flags(CREATE_NEW_PROCESS_GROUP | CREATE_NO_WINDOW);
|
|
}
|
|
|
|
command.spawn().map(|_| ())
|
|
}
|