extern struct scheduler sched_ctx; /* kernel/sched.c */
-void __USER__
-default_sighandler_term(int signum)
-{
- _exit(signum);
-}
+static u32_t term_sigs =
+ (1 << SIGSEGV) | (1 << SIGINT) | (1 << SIGKILL) | (1 << SIGTERM);
-void* default_handlers[_SIG_NUM] = {
- // TODO: 添加默认handler
- [_SIGINT] = default_sighandler_term, [_SIGTERM] = default_sighandler_term,
- [_SIGKILL] = default_sighandler_term, [_SIGSEGV] = default_sighandler_term,
- [_SIGINT] = default_sighandler_term,
-};
-
-volatile struct proc_sigstate __temp_save;
// Referenced in kernel/asm/x86/interrupt.S
void*
signal_dispatch()
return 0;
}
- if (!__current->sig_handler[sig_selected] &&
- !default_handlers[sig_selected]) {
- // 如果该信号没有handler,则忽略
+ if (!__current->sig_handler[sig_selected]) {
+ if ((term_sigs & (1 << sig_selected))) {
+ terminate_proc(sig_selected);
+ schedule();
+ // never return
+ }
return 0;
}
- uintptr_t ustack = __current->ustack_top & ~0xf;
+ ptr_t ustack = __current->ustack_top & ~0xf;
if ((int)(ustack - USTACK_END) < (int)sizeof(struct proc_sig)) {
// 用户栈没有空间存放信号上下文
解决办法就是先吧intr_ctx拷贝到一个静态分配的区域里,然后再注入到用户栈。
*/
+ static volatile struct proc_sigstate __temp_save;
__temp_save.proc_regs = __current->intr_ctx;
memcpy(__temp_save.fxstate, __current->fxstate, 512);
sig_ctx->sig_num = sig_selected;
sig_ctx->signal_handler = __current->sig_handler[sig_selected];
- if (!sig_ctx->signal_handler) {
- // 如果没有用户自定义的Handler,则使用系统默认Handler。
- sig_ctx->signal_handler = default_handlers[sig_selected];
- }
-
__SIGSET(__current->sig_inprogress, sig_selected);
return sig_ctx;
__current->flags &= ~PROC_FINPAUSE;
__SIGCLEAR(__current->sig_inprogress, sig_ctx->sig_num);
schedule();
+
+ // never reach!
+ return 0;
}
__DEFINE_LXSYSCALL3(int,