diff --git a/os/src/syscall/mod.rs b/os/src/syscall/mod.rs index 49281026..e7d7aae0 100644 --- a/os/src/syscall/mod.rs +++ b/os/src/syscall/mod.rs @@ -7,6 +7,8 @@ const SYSCALL_WRITE: usize = 64; const SYSCALL_EXIT: usize = 93; const SYSCALL_YIELD: usize = 124; const SYSCALL_KILL: usize = 129; +const SYSCALL_SIGACTION: usize = 134; +const SYSCALL_SIGPROCMASK: usize = 135; const SYSCALL_GET_TIME: usize = 169; const SYSCALL_GETPID: usize = 172; const SYSCALL_FORK: usize = 220; @@ -30,6 +32,8 @@ pub fn syscall(syscall_id: usize, args: [usize; 3]) -> isize { SYSCALL_EXIT => sys_exit(args[0] as i32), SYSCALL_YIELD => sys_yield(), SYSCALL_KILL => sys_kill(args[0], args[1] as u32), + SYSCALL_SIGACTION => sys_sigation(args[0] as u32, args[1], args[2]), + SYSCALL_SIGPROCMASK => sys_sigprocmask(args[0] as u32), SYSCALL_GET_TIME => sys_get_time(), SYSCALL_GETPID => sys_getpid(), SYSCALL_FORK => sys_fork(), diff --git a/os/src/syscall/process.rs b/os/src/syscall/process.rs index ede51750..aa591785 100644 --- a/os/src/syscall/process.rs +++ b/os/src/syscall/process.rs @@ -121,3 +121,22 @@ pub fn sys_kill(pid: usize, signal: u32) -> isize { -1 } } + +pub fn sys_sigprocmask(mask: u32) -> isize { + if let Some(task) = current_task() { + let mut inner = task.inner_exclusive_access(); + let old_mask = inner.signal_mask; + if let Some(flag) = SignalFlags::from_bits(mask) { + inner.signal_mask = flag; + old_mask.bits() as isize + } else { + -1 + } + } else { + -1 + } +} + +pub fn sys_sigation(_signal: u32, _action: usize, _old_action: usize) -> isize { + 0 +} diff --git a/os/src/task/task.rs b/os/src/task/task.rs index f9e4a102..6db89537 100644 --- a/os/src/task/task.rs +++ b/os/src/task/task.rs @@ -30,7 +30,8 @@ pub struct TaskControlBlockInner { pub exit_code: i32, pub fd_table: Vec>>, pub signals: SignalFlags, - pub pending_signals: SignalFlags + pub pending_signals: SignalFlags, + pub signal_mask: SignalFlags } impl TaskControlBlockInner { @@ -93,7 +94,8 @@ impl TaskControlBlock { Some(Arc::new(Stdout)), ], signals: SignalFlags::empty(), - pending_signals: SignalFlags::empty() + pending_signals: SignalFlags::empty(), + signal_mask: SignalFlags::empty() }) }, }; @@ -196,7 +198,8 @@ impl TaskControlBlock { exit_code: 0, fd_table: new_fd_table, signals: SignalFlags::empty(), - pending_signals: SignalFlags::empty() + pending_signals: SignalFlags::empty(), + signal_mask: SignalFlags::empty() }) }, });