1 /** 2 * @file signal.h 3 * @author longjin (longjin@RinGoTek.cn) 4 * @brief signal相关类型在C语言中的导出。(以rust版本为准) 5 * @version 0.1 6 * 7 * @copyright Copyright (c) 2022 8 * 9 */ 10 #pragma once 11 #include <DragonOS/refcount.h> 12 #include <common/atomic.h> 13 #include <common/list.h> 14 #include <common/spinlock.h> 15 #include <common/sys/types.h> 16 #include <common/wait_queue.h> 17 18 // 系统最大支持的信号数量 19 #define MAX_SIG_NUM 64 20 // sigset所占用的u64的数量 21 #define _NSIG_U64_CNT (MAX_SIG_NUM / 64) 22 23 typedef void __signalfn_t(int); 24 typedef __signalfn_t *__sighandler_t; 25 26 typedef uint64_t sigset_t; 27 28 #define SIGHUP 1 29 #define SIGINT 2 30 #define SIGQUIT 3 31 #define SIGILL 4 32 #define SIGTRAP 5 33 #define SIGABRT 6 34 #define SIGIOT 6 35 #define SIGBUS 7 36 #define SIGFPE 8 37 #define SIGKILL 9 38 #define SIGUSR1 10 39 #define SIGSEGV 11 40 #define SIGUSR2 12 41 #define SIGPIPE 13 42 #define SIGALRM 14 43 #define SIGTERM 15 44 #define SIGSTKFLT 16 45 #define SIGCHLD 17 46 #define SIGCONT 18 47 #define SIGSTOP 19 48 #define SIGTSTP 20 49 #define SIGTTIN 21 50 #define SIGTTOU 22 51 #define SIGURG 23 52 #define SIGXCPU 24 53 #define SIGXFSZ 25 54 #define SIGVTALRM 26 55 #define SIGPROF 27 56 #define SIGWINCH 28 57 #define SIGIO 29 58 #define SIGPOLL SIGIO 59 60 #define SIGPWR 30 61 #define SIGSYS 31 62 63 /* These should not be considered constants from userland. */ 64 #define SIGRTMIN 32 65 #define SIGRTMAX MAX_SIG_NUM 66 67 // 注意,该结构体最大16字节 68 union __sifields { 69 /* kill() */ 70 struct 71 { 72 pid_t _pid; /* 信号发送者的pid */ 73 } _kill; 74 }; 75 76 // 注意,该结构体最大大小为32字节 77 #define __SIGINFO \ 78 struct \ 79 { \ 80 int32_t si_signo; /* signal number */ \ 81 int32_t si_code; \ 82 int32_t si_errno; \ 83 uint32_t reserved; /* 保留备用 */ \ 84 union __sifields _sifields; \ 85 } 86 87 struct siginfo 88 { 89 union { 90 __SIGINFO; 91 uint64_t padding[4]; // 让siginfo占用32字节大小 92 }; 93 }; 94 95 /** 96 * @brief 信号处理结构体 97 * 98 */ 99 struct sigaction 100 { 101 // 信号处理函数的指针 102 union { 103 __sighandler_t _sa_handler; 104 void (*_sa_sigaction)(int sig, struct siginfo *sinfo, void *); 105 } _u; 106 uint64_t sa_flags; 107 sigset_t sa_mask; 108 void (*sa_restorer)(void); // 暂时未实现 109 }; 110 111 // ============ sigaction结构体中的的sa_flags的可选值 =========== 112 #define SA_FLAG_IGN (1UL << 0) // 当前sigaction表示忽略信号的动作 113 #define SA_FLAG_DFL (1UL << 1) // 当前sigaction表示系统默认的动作 114 #define SA_FLAG_RESTORER (1UL << 2) // 当前sigaction具有用户指定的restorer 115 #define SA_FLAG_IMMUTABLE (1UL << 3) // 当前sigaction不可被更改 116 117 /** 118 * 由于signal_struct总是和sighand_struct一起使用,并且信号处理的过程中必定会对sighand加锁, 119 * 因此signal_struct不用加锁 120 */ 121 struct signal_struct 122 { 123 atomic_t sig_cnt; 124 }; 125 126 /** 127 * @brief 信号处理结构体,位于pcb之中。 128 * 请注意,该结构体需要与rust的版本一致,且以rust的为准 129 */ 130 struct sighand_struct 131 { 132 spinlock_t siglock; 133 refcount_t count; 134 // 为每个信号注册的处理函数的结构体 135 struct sigaction action[MAX_SIG_NUM]; 136 }; 137 138 /** 139 * @brief 正在等待的信号的标志位 140 */ 141 struct sigpending 142 { 143 sigset_t signal; 144 void *sigqueue; // 信号队列(在rust中实现) 145 };