1*2eab6dd7S曾俊 use log::error;
2*2eab6dd7S曾俊
34fda81ceSLoGin use crate::{
44fda81ceSLoGin arch::{sched::sched, CurrentIrqArch},
54fda81ceSLoGin exception::InterruptArch,
64fda81ceSLoGin process::ProcessManager,
74fda81ceSLoGin };
84fda81ceSLoGin
94fda81ceSLoGin /// 信号最大值
104fda81ceSLoGin pub const MAX_SIG_NUM: usize = 64;
114fda81ceSLoGin #[allow(dead_code)]
124fda81ceSLoGin #[derive(Eq)]
134fda81ceSLoGin #[repr(usize)]
144fda81ceSLoGin #[allow(non_camel_case_types)]
154fda81ceSLoGin #[atomic_enum]
164fda81ceSLoGin pub enum Signal {
174fda81ceSLoGin INVALID = 0,
184fda81ceSLoGin SIGHUP = 1,
194fda81ceSLoGin SIGINT,
204fda81ceSLoGin SIGQUIT,
214fda81ceSLoGin SIGILL,
224fda81ceSLoGin SIGTRAP,
234fda81ceSLoGin /// SIGABRT和SIGIOT共用这个号码
244fda81ceSLoGin SIGABRT_OR_IOT,
254fda81ceSLoGin SIGBUS,
264fda81ceSLoGin SIGFPE,
274fda81ceSLoGin SIGKILL,
284fda81ceSLoGin SIGUSR1,
294fda81ceSLoGin
304fda81ceSLoGin SIGSEGV = 11,
314fda81ceSLoGin SIGUSR2,
324fda81ceSLoGin SIGPIPE,
334fda81ceSLoGin SIGALRM,
344fda81ceSLoGin SIGTERM,
354fda81ceSLoGin SIGSTKFLT,
364fda81ceSLoGin SIGCHLD,
374fda81ceSLoGin SIGCONT,
384fda81ceSLoGin SIGSTOP,
394fda81ceSLoGin SIGTSTP,
404fda81ceSLoGin
414fda81ceSLoGin SIGTTIN = 21,
424fda81ceSLoGin SIGTTOU,
434fda81ceSLoGin SIGURG,
444fda81ceSLoGin SIGXCPU,
454fda81ceSLoGin SIGXFSZ,
464fda81ceSLoGin SIGVTALRM,
474fda81ceSLoGin SIGPROF,
484fda81ceSLoGin SIGWINCH,
494fda81ceSLoGin /// SIGIO和SIGPOLL共用这个号码
504fda81ceSLoGin SIGIO_OR_POLL,
514fda81ceSLoGin SIGPWR,
524fda81ceSLoGin
534fda81ceSLoGin SIGSYS = 31,
544fda81ceSLoGin
554fda81ceSLoGin SIGRTMIN = 32,
564fda81ceSLoGin SIGRTMAX = 64,
574fda81ceSLoGin }
584fda81ceSLoGin
594fda81ceSLoGin /// 为Signal实现判断相等的trait
604fda81ceSLoGin impl PartialEq for Signal {
eq(&self, other: &Signal) -> bool614fda81ceSLoGin fn eq(&self, other: &Signal) -> bool {
624fda81ceSLoGin *self as usize == *other as usize
634fda81ceSLoGin }
644fda81ceSLoGin }
654fda81ceSLoGin
664fda81ceSLoGin impl From<usize> for Signal {
from(value: usize) -> Self674fda81ceSLoGin fn from(value: usize) -> Self {
684fda81ceSLoGin if value <= MAX_SIG_NUM {
694fda81ceSLoGin let ret: Signal = unsafe { core::mem::transmute(value) };
704fda81ceSLoGin return ret;
714fda81ceSLoGin } else {
72*2eab6dd7S曾俊 error!("Try to convert an invalid number to Signal");
734fda81ceSLoGin return Signal::INVALID;
744fda81ceSLoGin }
754fda81ceSLoGin }
764fda81ceSLoGin }
774fda81ceSLoGin
784fda81ceSLoGin impl Into<usize> for Signal {
into(self) -> usize794fda81ceSLoGin fn into(self) -> usize {
804fda81ceSLoGin self as usize
814fda81ceSLoGin }
824fda81ceSLoGin }
834fda81ceSLoGin
844fda81ceSLoGin impl From<i32> for Signal {
from(value: i32) -> Self854fda81ceSLoGin fn from(value: i32) -> Self {
864fda81ceSLoGin if value < 0 {
87*2eab6dd7S曾俊 error!("Try to convert an invalid number to Signal");
884fda81ceSLoGin return Signal::INVALID;
894fda81ceSLoGin } else {
904fda81ceSLoGin return Self::from(value as usize);
914fda81ceSLoGin }
924fda81ceSLoGin }
934fda81ceSLoGin }
944fda81ceSLoGin
954fda81ceSLoGin impl Into<SigSet> for Signal {
into(self) -> SigSet964fda81ceSLoGin fn into(self) -> SigSet {
974fda81ceSLoGin SigSet {
984fda81ceSLoGin bits: (1 << (self as usize - 1) as u64),
994fda81ceSLoGin }
1004fda81ceSLoGin }
1014fda81ceSLoGin }
1024fda81ceSLoGin impl Signal {
1034fda81ceSLoGin /// 判断一个数字是否为可用的信号
1044fda81ceSLoGin #[inline]
is_valid(&self) -> bool1054fda81ceSLoGin pub fn is_valid(&self) -> bool {
1064fda81ceSLoGin return (*self) as usize <= MAX_SIG_NUM;
1074fda81ceSLoGin }
1084fda81ceSLoGin
1094fda81ceSLoGin /// const convertor between `Signal` and `SigSet`
into_sigset(self) -> SigSet1104fda81ceSLoGin pub const fn into_sigset(self) -> SigSet {
1114fda81ceSLoGin SigSet {
1124fda81ceSLoGin bits: (1 << (self as usize - 1) as u64),
1134fda81ceSLoGin }
1144fda81ceSLoGin }
1154fda81ceSLoGin
1164fda81ceSLoGin /// 判断一个信号是不是实时信号
1174fda81ceSLoGin ///
1184fda81ceSLoGin /// ## 返回值
1194fda81ceSLoGin ///
1204fda81ceSLoGin /// - `true` 这个信号是实时信号
1214fda81ceSLoGin /// - `false` 这个信号不是实时信号
1224fda81ceSLoGin #[inline]
is_rt_signal(&self) -> bool1234fda81ceSLoGin pub fn is_rt_signal(&self) -> bool {
1244fda81ceSLoGin return (*self) as usize >= Signal::SIGRTMIN.into();
1254fda81ceSLoGin }
1264fda81ceSLoGin
1274fda81ceSLoGin /// 调用信号的默认处理函数
handle_default(&self)1284fda81ceSLoGin pub fn handle_default(&self) {
1294fda81ceSLoGin match self {
1304fda81ceSLoGin Signal::INVALID => {
131*2eab6dd7S曾俊 error!("attempting to handler an Invalid");
1324fda81ceSLoGin }
1334fda81ceSLoGin Signal::SIGHUP => sig_terminate(self.clone()),
1344fda81ceSLoGin Signal::SIGINT => sig_terminate(self.clone()),
1354fda81ceSLoGin Signal::SIGQUIT => sig_terminate_dump(self.clone()),
1364fda81ceSLoGin Signal::SIGILL => sig_terminate_dump(self.clone()),
1374fda81ceSLoGin Signal::SIGTRAP => sig_terminate_dump(self.clone()),
1384fda81ceSLoGin Signal::SIGABRT_OR_IOT => sig_terminate_dump(self.clone()),
1394fda81ceSLoGin Signal::SIGBUS => sig_terminate_dump(self.clone()),
1404fda81ceSLoGin Signal::SIGFPE => sig_terminate_dump(self.clone()),
1414fda81ceSLoGin Signal::SIGKILL => sig_terminate(self.clone()),
1424fda81ceSLoGin Signal::SIGUSR1 => sig_terminate(self.clone()),
1434fda81ceSLoGin Signal::SIGSEGV => sig_terminate_dump(self.clone()),
1444fda81ceSLoGin Signal::SIGUSR2 => sig_terminate(self.clone()),
1454fda81ceSLoGin Signal::SIGPIPE => sig_terminate(self.clone()),
1464fda81ceSLoGin Signal::SIGALRM => sig_terminate(self.clone()),
1474fda81ceSLoGin Signal::SIGTERM => sig_terminate(self.clone()),
1484fda81ceSLoGin Signal::SIGSTKFLT => sig_terminate(self.clone()),
1494fda81ceSLoGin Signal::SIGCHLD => sig_ignore(self.clone()),
1504fda81ceSLoGin Signal::SIGCONT => sig_continue(self.clone()),
1514fda81ceSLoGin Signal::SIGSTOP => sig_stop(self.clone()),
1524fda81ceSLoGin Signal::SIGTSTP => sig_stop(self.clone()),
1534fda81ceSLoGin Signal::SIGTTIN => sig_stop(self.clone()),
1544fda81ceSLoGin Signal::SIGTTOU => sig_stop(self.clone()),
1554fda81ceSLoGin Signal::SIGURG => sig_ignore(self.clone()),
1564fda81ceSLoGin Signal::SIGXCPU => sig_terminate_dump(self.clone()),
1574fda81ceSLoGin Signal::SIGXFSZ => sig_terminate_dump(self.clone()),
1584fda81ceSLoGin Signal::SIGVTALRM => sig_terminate(self.clone()),
1594fda81ceSLoGin Signal::SIGPROF => sig_terminate(self.clone()),
1604fda81ceSLoGin Signal::SIGWINCH => sig_ignore(self.clone()),
1614fda81ceSLoGin Signal::SIGIO_OR_POLL => sig_terminate(self.clone()),
1624fda81ceSLoGin Signal::SIGPWR => sig_terminate(self.clone()),
1634fda81ceSLoGin Signal::SIGSYS => sig_terminate(self.clone()),
1644fda81ceSLoGin Signal::SIGRTMIN => sig_terminate(self.clone()),
1654fda81ceSLoGin Signal::SIGRTMAX => sig_terminate(self.clone()),
1664fda81ceSLoGin }
1674fda81ceSLoGin }
1684fda81ceSLoGin }
1694fda81ceSLoGin
1704fda81ceSLoGin /// siginfo中的si_code的可选值
1714fda81ceSLoGin /// 请注意,当这个值小于0时,表示siginfo来自用户态,否则来自内核态
1724fda81ceSLoGin #[derive(Copy, Debug, Clone)]
1734fda81ceSLoGin #[repr(i32)]
1744fda81ceSLoGin pub enum SigCode {
1754fda81ceSLoGin /// sent by kill, sigsend, raise
1764fda81ceSLoGin User = 0,
1774fda81ceSLoGin /// sent by kernel from somewhere
1784fda81ceSLoGin Kernel = 0x80,
1794fda81ceSLoGin /// 通过sigqueue发送
1804fda81ceSLoGin Queue = -1,
1814fda81ceSLoGin /// 定时器过期时发送
1824fda81ceSLoGin Timer = -2,
1834fda81ceSLoGin /// 当实时消息队列的状态发生改变时发送
1844fda81ceSLoGin Mesgq = -3,
1854fda81ceSLoGin /// 当异步IO完成时发送
1864fda81ceSLoGin AsyncIO = -4,
1874fda81ceSLoGin /// sent by queued SIGIO
1884fda81ceSLoGin SigIO = -5,
1894fda81ceSLoGin }
1904fda81ceSLoGin
1914fda81ceSLoGin impl SigCode {
1924fda81ceSLoGin /// 为SigCode这个枚举类型实现从i32转换到枚举类型的转换函数
1934fda81ceSLoGin #[allow(dead_code)]
from_i32(x: i32) -> SigCode1944fda81ceSLoGin pub fn from_i32(x: i32) -> SigCode {
1954fda81ceSLoGin match x {
1964fda81ceSLoGin 0 => Self::User,
1974fda81ceSLoGin 0x80 => Self::Kernel,
1984fda81ceSLoGin -1 => Self::Queue,
1994fda81ceSLoGin -2 => Self::Timer,
2004fda81ceSLoGin -3 => Self::Mesgq,
2014fda81ceSLoGin -4 => Self::AsyncIO,
2024fda81ceSLoGin -5 => Self::SigIO,
2034fda81ceSLoGin _ => panic!("signal code not valid"),
2044fda81ceSLoGin }
2054fda81ceSLoGin }
2064fda81ceSLoGin }
2074fda81ceSLoGin
2084fda81ceSLoGin bitflags! {
2094fda81ceSLoGin #[repr(C,align(8))]
2104fda81ceSLoGin #[derive(Default)]
2114fda81ceSLoGin pub struct SigFlags:u32{
2124fda81ceSLoGin const SA_NOCLDSTOP = 1;
2134fda81ceSLoGin const SA_NOCLDWAIT = 2;
2144fda81ceSLoGin const SA_SIGINFO = 4;
2154fda81ceSLoGin const SA_ONSTACK = 0x08000000;
2164fda81ceSLoGin const SA_RESTART = 0x10000000;
2174fda81ceSLoGin const SA_NODEFER = 0x40000000;
2184fda81ceSLoGin const SA_RESETHAND = 0x80000000;
2194fda81ceSLoGin const SA_RESTORER =0x04000000;
2204fda81ceSLoGin const SA_ALL = Self::SA_NOCLDSTOP.bits()|Self::SA_NOCLDWAIT.bits()|Self::SA_NODEFER.bits()|Self::SA_ONSTACK.bits()|Self::SA_RESETHAND.bits()|Self::SA_RESTART.bits()|Self::SA_SIGINFO.bits()|Self::SA_RESTORER.bits();
2214fda81ceSLoGin }
2224fda81ceSLoGin
2234fda81ceSLoGin /// 请注意,sigset 这个bitmap, 第0位表示sig=1的信号。也就是说,Signal-1才是sigset_t中对应的位
2244fda81ceSLoGin #[derive(Default)]
2254fda81ceSLoGin pub struct SigSet:u64{
2264fda81ceSLoGin const SIGHUP = 1<<0;
2274fda81ceSLoGin const SIGINT = 1<<1;
2284fda81ceSLoGin const SIGQUIT = 1<<2;
2294fda81ceSLoGin const SIGILL = 1<<3;
2304fda81ceSLoGin const SIGTRAP = 1<<4;
2314fda81ceSLoGin /// SIGABRT和SIGIOT共用这个号码
2324fda81ceSLoGin const SIGABRT_OR_IOT = 1<<5;
2334fda81ceSLoGin const SIGBUS = 1<<6;
2344fda81ceSLoGin const SIGFPE = 1<<7;
2354fda81ceSLoGin const SIGKILL = 1<<8;
2364fda81ceSLoGin const SIGUSR = 1<<9;
2374fda81ceSLoGin const SIGSEGV = 1<<10;
2384fda81ceSLoGin const SIGUSR2 = 1<<11;
2394fda81ceSLoGin const SIGPIPE = 1<<12;
2404fda81ceSLoGin const SIGALRM = 1<<13;
2414fda81ceSLoGin const SIGTERM = 1<<14;
2424fda81ceSLoGin const SIGSTKFLT= 1<<15;
2434fda81ceSLoGin const SIGCHLD = 1<<16;
2444fda81ceSLoGin const SIGCONT = 1<<17;
2454fda81ceSLoGin const SIGSTOP = 1<<18;
2464fda81ceSLoGin const SIGTSTP = 1<<19;
2474fda81ceSLoGin const SIGTTIN = 1<<20;
2484fda81ceSLoGin const SIGTTOU = 1<<21;
2494fda81ceSLoGin const SIGURG = 1<<22;
2504fda81ceSLoGin const SIGXCPU = 1<<23;
2514fda81ceSLoGin const SIGXFSZ = 1<<24;
2524fda81ceSLoGin const SIGVTALRM= 1<<25;
2534fda81ceSLoGin const SIGPROF = 1<<26;
2544fda81ceSLoGin const SIGWINCH = 1<<27;
2554fda81ceSLoGin /// SIGIO和SIGPOLL共用这个号码
2564fda81ceSLoGin const SIGIO_OR_POLL = 1<<28;
2574fda81ceSLoGin const SIGPWR = 1<<29;
2584fda81ceSLoGin const SIGSYS = 1<<30;
2594fda81ceSLoGin const SIGRTMIN = 1<<31;
2604fda81ceSLoGin // TODO 写上实时信号
2614fda81ceSLoGin const SIGRTMAX = 1<<MAX_SIG_NUM-1;
2624fda81ceSLoGin }
2634fda81ceSLoGin }
2644fda81ceSLoGin
2654fda81ceSLoGin /// SIGCHLD si_codes
2664fda81ceSLoGin #[derive(Debug, Clone, Copy, PartialEq, Eq, ToPrimitive)]
2674fda81ceSLoGin #[allow(dead_code)]
2684fda81ceSLoGin pub enum SigChildCode {
2694fda81ceSLoGin /// child has exited
2704fda81ceSLoGin ///
2714fda81ceSLoGin /// CLD_EXITED
2724fda81ceSLoGin Exited = 1,
2734fda81ceSLoGin /// child was killed
2744fda81ceSLoGin ///
2754fda81ceSLoGin /// CLD_KILLED
2764fda81ceSLoGin Killed = 2,
2774fda81ceSLoGin /// child terminated abnormally
2784fda81ceSLoGin ///
2794fda81ceSLoGin /// CLD_DUMPED
2804fda81ceSLoGin Dumped = 3,
2814fda81ceSLoGin /// traced child has trapped
2824fda81ceSLoGin ///
2834fda81ceSLoGin /// CLD_TRAPPED
2844fda81ceSLoGin Trapped = 4,
2854fda81ceSLoGin /// child has stopped
2864fda81ceSLoGin ///
2874fda81ceSLoGin /// CLD_STOPPED
2884fda81ceSLoGin Stopped = 5,
2894fda81ceSLoGin /// stopped child has continued
2904fda81ceSLoGin ///
2914fda81ceSLoGin /// CLD_CONTINUED
2924fda81ceSLoGin Continued = 6,
2934fda81ceSLoGin }
2944fda81ceSLoGin
2954fda81ceSLoGin impl Into<i32> for SigChildCode {
into(self) -> i322964fda81ceSLoGin fn into(self) -> i32 {
2974fda81ceSLoGin self as i32
2984fda81ceSLoGin }
2994fda81ceSLoGin }
3004fda81ceSLoGin
3014fda81ceSLoGin /// 信号默认处理函数——终止进程
sig_terminate(sig: Signal)3024fda81ceSLoGin fn sig_terminate(sig: Signal) {
3034fda81ceSLoGin ProcessManager::exit(sig as usize);
3044fda81ceSLoGin }
3054fda81ceSLoGin
3064fda81ceSLoGin /// 信号默认处理函数——终止进程并生成 core dump
sig_terminate_dump(sig: Signal)3074fda81ceSLoGin fn sig_terminate_dump(sig: Signal) {
3084fda81ceSLoGin ProcessManager::exit(sig as usize);
3094fda81ceSLoGin // TODO 生成 coredump 文件
3104fda81ceSLoGin }
3114fda81ceSLoGin
3124fda81ceSLoGin /// 信号默认处理函数——暂停进程
sig_stop(sig: Signal)3134fda81ceSLoGin fn sig_stop(sig: Signal) {
3144fda81ceSLoGin let guard = unsafe { CurrentIrqArch::save_and_disable_irq() };
3154fda81ceSLoGin ProcessManager::mark_stop().unwrap_or_else(|e| {
316*2eab6dd7S曾俊 error!(
3174fda81ceSLoGin "sleep error :{:?},failed to sleep process :{:?}, with signal :{:?}",
3184fda81ceSLoGin e,
3194fda81ceSLoGin ProcessManager::current_pcb(),
3204fda81ceSLoGin sig
3214fda81ceSLoGin );
3224fda81ceSLoGin });
3234fda81ceSLoGin drop(guard);
3244fda81ceSLoGin sched();
3254fda81ceSLoGin // TODO 暂停进程
3264fda81ceSLoGin }
3274fda81ceSLoGin
3284fda81ceSLoGin /// 信号默认处理函数——继续进程
sig_continue(sig: Signal)3294fda81ceSLoGin fn sig_continue(sig: Signal) {
3304fda81ceSLoGin ProcessManager::wakeup_stop(&ProcessManager::current_pcb()).unwrap_or_else(|_| {
331*2eab6dd7S曾俊 error!(
3324fda81ceSLoGin "Failed to wake up process pid = {:?} with signal :{:?}",
3334fda81ceSLoGin ProcessManager::current_pcb().pid(),
3344fda81ceSLoGin sig
3354fda81ceSLoGin );
3364fda81ceSLoGin });
3374fda81ceSLoGin }
3384fda81ceSLoGin /// 信号默认处理函数——忽略
sig_ignore(_sig: Signal)3394fda81ceSLoGin fn sig_ignore(_sig: Signal) {
3404fda81ceSLoGin return;
3414fda81ceSLoGin }
342