code:ssig - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki
- 设置某类型进程信号的处理函数
- 从用户态传入两个参数:
- 参数1(u_arg[0]):sig,信号类型号
- 参数2(u_arg[1]):*func,信号处理函数入口地址
3613
3614 ssig()
3615 {
3616 register a;
3617
3618 a = u.u_arg[0];
3619 if(a<=0 || a>=NSIG || a ==SIGKIL) {
- a = 信号类型号
3620 u.u_error = EINVAL;
3621 return;
- 若类型号越界或为类型9(自我终止信号)
- 抛出错误
- 错误代码:EINVAL
3622 }
3623 u.u_ar0[R0] = u.u_signal[a];
3624 u.u_signal[a] = u.u_arg[1];
- 原信号处理函数入口地址暂存入R0,向用户态返回
3625 if(u.u_procp->p_sig == a)
- 将信号a的处理函数置为参数2
3626 u.u_procp->p_sig = 0;
3627 }
- 若当前进程 接受到的信号 为 a,则 清信号
- 信号处理方式不一样了...原先的信号不再处理了
3628 /* ------------------------- */
- (signal = 48.)
- sys signal; sig; label
- (old value in r0)