Remove deprecated libc::daemon call

Since version 10.5 of macOS the libc::daemon call has been deprecated.
While it is recommended by macOS to use launchd instead, this is not
easily available on other unix platforms.

However since we just spawn a daemon process to prevent Alacritty from
spawning zombies, we can manually invoke `fork` in the child process to
cause a double-fork and re-parent the child process under init so it can
be reaped automatically.

Since the daemon call is not part of POSIX, using the double fork on all
unix platforms also has some portability advantages.
This commit is contained in:
Christian Duerr 2019-03-21 19:55:19 +00:00 committed by GitHub
parent c6ab2a8867
commit 32cb48774a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 7 additions and 3 deletions

View File

@ -15,6 +15,7 @@
use std::{cmp, io};
use std::ffi::OsStr;
use std::process::Command;
use std::process::Stdio;
#[cfg(not(windows))]
use std::os::unix::process::CommandExt;
@ -22,8 +23,6 @@ use std::os::unix::process::CommandExt;
#[cfg(windows)]
use std::os::windows::process::CommandExt;
#[cfg(windows)]
use std::process::Stdio;
#[cfg(windows)]
use winapi::um::winbase::{CREATE_NEW_PROCESS_GROUP, CREATE_NO_WINDOW};
/// Threading utilities
@ -94,8 +93,13 @@ pub fn start_daemon<I, S>(program: &str, args: I) -> io::Result<()>
{
Command::new(program)
.args(args)
.stdin(Stdio::null())
.stdout(Stdio::null())
.stderr(Stdio::null())
.before_exec(|| unsafe {
::libc::daemon(1, 0);
if ::libc::fork() != 0 {
std::process::exit(0);
}
Ok(())
})
.spawn()?