浏览代码

设置前台进程组 (#48)

MemoryShore 6 月之前
父节点
当前提交
b0dea7c16f
共有 2 个文件被更改,包括 10 次插入11 次删除
  1. 5 1
      src/shell/command/mod.rs
  2. 5 10
      src/shell/mod.rs

+ 5 - 1
src/shell/command/mod.rs

@@ -315,7 +315,11 @@ impl Shell {
             .expect("Failed to execute command");
 
         if !run_backend {
-            let _ = child.wait();
+            unsafe {
+                libc::tcsetpgrp(libc::STDIN_FILENO, child.id() as i32);
+                let _ = child.wait();
+                libc::tcsetpgrp(libc::STDIN_FILENO, std::process::id() as i32);
+            };
         } else {
             self.add_backend_task(child);
         }

+ 5 - 10
src/shell/mod.rs

@@ -52,26 +52,24 @@ impl Shell {
     }
 
     pub fn exec(&mut self) {
-        // 开启终端raw模式
+        // 设置前台进程组
+        unsafe {
+            libc::tcsetpgrp(libc::STDIN_FILENO, std::process::id() as i32);
+        };
+
         // 开启终端raw模式
         crossterm::terminal::enable_raw_mode().expect("failed to enable raw mode");
 
-        // 循环读取一行
-
         // 循环读取一行
         loop {
             self.printer.init_before_readline();
             // 读取一行
-            // 读取一行
             if self.readline() == 0 {
                 println!();
                 break;
             }
 
             let command_bytes = self.printer.buf.borrow().clone();
-
-            // 如果命令不以空格开头且不跟上一条命令相同,这条命令会被记录
-
             // 如果命令不以空格开头且不跟上一条命令相同,这条命令会被记录
             if !command_bytes.is_empty()
                 && !command_bytes.starts_with(&[b' '])
@@ -87,9 +85,6 @@ impl Shell {
                     .push(Rc::new(RefCell::new(command_bytes.clone())));
                 self.write_commands(&command_bytes);
             };
-
-            // 命令不为空,执行命令
-
             // 命令不为空,执行命令
             if !command_bytes.iter().all(|&byte| byte == b' ') {
                 self.exec_commands_in_line(&command_bytes);