add comment

This commit is contained in:
WindSoilder 2022-08-01 19:04:56 +08:00
parent fbdb6e8ea0
commit a9f31dd95c
2 changed files with 10 additions and 3 deletions

View File

@ -13,7 +13,7 @@ use nu_protocol::{Category, Example, ListStream, PipelineData, RawStream, Span,
use itertools::Itertools;
use nu_engine::CallExt;
use nu_system::external_process_setup::{reset_foreground_id, set_foreground, setup_fg_external};
use nu_system::external_process_setup::{reset_foreground_id, set_foreground, prepare_to_foreground};
use pathdiff::diff_paths;
use regex::Regex;
@ -141,7 +141,7 @@ impl ExternalCommand {
#[cfg(not(windows))]
{
setup_fg_external(&mut process);
prepare_to_foreground(&mut process);
child = process.spawn()
}

View File

@ -5,7 +5,7 @@
#[cfg(target_family = "unix")]
pub mod external_process_setup {
use std::os::unix::prelude::CommandExt;
pub fn setup_fg_external(external_command: &mut std::process::Command) {
pub fn prepare_to_foreground(external_command: &mut std::process::Command) {
unsafe {
libc::signal(libc::SIGTTOU, libc::SIG_IGN);
libc::signal(libc::SIGTTIN, libc::SIG_IGN);
@ -14,18 +14,24 @@ pub mod external_process_setup {
// make the command startup with new process group.
// The process group id must be the same as external commands' pid.
// Or else we'll failed to set it as foreground process.
// For more information, refer to `fork_child_for_process` function:
// https://github.com/fish-shell/fish-shell/blob/023042098396aa450d2c4ea1eb9341312de23126/src/exec.cpp#L398
libc::setpgid(0, 0);
Ok(())
});
}
}
/// Before call this function, `prepare_to_foreground` function must be called. Or else
/// it'll failed with silence.
pub fn set_foreground(process: &std::process::Child) {
unsafe {
libc::tcsetpgrp(libc::STDIN_FILENO, process.id() as i32);
}
}
/// It can only be called when you have called `set_foreground`, or else
/// Something strange will happened.
pub fn reset_foreground_id() {
unsafe {
libc::tcsetpgrp(libc::STDIN_FILENO, libc::getpgrp());
@ -35,6 +41,7 @@ pub mod external_process_setup {
}
}
// TODO: investigate if we can set foreground process through windows system call.
#[cfg(target_family = "windows")]
mod external_process_setup {