修复tty处理信号时错误地将前台进程组置空的问题 & clone时未拷贝父进程tty的问题 (#1043)

* 修复clone时未拷贝父进程tty的问题

* 修复tty处理信号时错误地将前台进程组置空的问题
This commit is contained in:
MemoryShore 2024-11-12 16:31:13 +08:00 committed by GitHub
parent 0f094e50de
commit ff76b0fcb8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 7 additions and 11 deletions

View File

@ -785,14 +785,12 @@ impl NTtyData {
signal: Signal, signal: Signal,
) { ) {
// 先处理信号 // 先处理信号
let mut ctrl_info = tty.core().contorl_info_irqsave(); let ctrl_info = tty.core().contorl_info_irqsave();
let pg = ctrl_info.pgid; let pg = ctrl_info.pgid;
if let Some(pg) = pg { if let Some(pg) = pg {
let _ = Syscall::kill(pg, signal as i32); let _ = Syscall::kill(pg, signal as i32);
} }
ctrl_info.pgid = None;
if !termios.local_mode.contains(LocalMode::NOFLSH) { if !termios.local_mode.contains(LocalMode::NOFLSH) {
// 重置 // 重置
self.echo_head = 0; self.echo_head = 0;

View File

@ -169,11 +169,6 @@ impl ProcessManager {
let pcb = ProcessControlBlock::new(name, new_kstack); let pcb = ProcessControlBlock::new(name, new_kstack);
// TODO: 注意这里设置tty的操作不符合Linux的行为毕竟创建进程不一定要fork也可以用clone来创建
// 正确做法应该是在实现进程组之后去管理前台进程组。
pcb.sig_info_mut()
.set_tty(current_pcb.sig_info_irqsave().tty());
let mut args = KernelCloneArgs::new(); let mut args = KernelCloneArgs::new();
args.flags = clone_flags; args.flags = clone_flags;
args.exit_signal = Signal::SIGCHLD; args.exit_signal = Signal::SIGCHLD;

View File

@ -705,16 +705,17 @@ impl ProcessControlBlock {
#[inline(never)] #[inline(never)]
fn do_create_pcb(name: String, kstack: KernelStack, is_idle: bool) -> Arc<Self> { fn do_create_pcb(name: String, kstack: KernelStack, is_idle: bool) -> Arc<Self> {
let (pid, ppid, cwd, cred) = if is_idle { let (pid, ppid, cwd, cred, tty) = if is_idle {
let cred = INIT_CRED.clone(); let cred = INIT_CRED.clone();
(Pid(0), Pid(0), "/".to_string(), cred) (Pid(0), Pid(0), "/".to_string(), cred, None)
} else { } else {
let ppid = ProcessManager::current_pcb().pid(); let ppid = ProcessManager::current_pcb().pid();
let mut cred = ProcessManager::current_pcb().cred(); let mut cred = ProcessManager::current_pcb().cred();
cred.cap_permitted = cred.cap_ambient; cred.cap_permitted = cred.cap_ambient;
cred.cap_effective = cred.cap_ambient; cred.cap_effective = cred.cap_ambient;
let cwd = ProcessManager::current_pcb().basic().cwd(); let cwd = ProcessManager::current_pcb().basic().cwd();
(Self::generate_pid(), ppid, cwd, cred) let tty = ProcessManager::current_pcb().sig_info_irqsave().tty();
(Self::generate_pid(), ppid, cwd, cred, tty)
}; };
let basic_info = ProcessBasicInfo::new(Pid(0), ppid, Pid(0), name, cwd, None); let basic_info = ProcessBasicInfo::new(Pid(0), ppid, Pid(0), name, cwd, None);
@ -754,6 +755,8 @@ impl ProcessControlBlock {
cred: SpinLock::new(cred), cred: SpinLock::new(cred),
}; };
pcb.sig_info.write().set_tty(tty);
// 初始化系统调用栈 // 初始化系统调用栈
#[cfg(target_arch = "x86_64")] #[cfg(target_arch = "x86_64")]
pcb.arch_info pcb.arch_info