code:ssig - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki

Source

  • 设置某类型进程信号的处理函数
  • 从用户态传入两个参数:
    • 参数1(u_arg[0]):sig,信号类型号
    • 参数2(u_arg[1]):*func,信号处理函数入口地址

3613

3614 ssig()

3615 {

3616     register a;

3617

3618     a = u.u_arg[0];

  • a = 信号类型号
3619     if(a<=0 || a>=NSIG || a ==SIGKIL) {

3620           u.u_error = EINVAL;

  • 若类型号越界或为类型9(自我终止信号)
3621           return;

3622     }

3623     u.u_ar0[R0] = u.u_signal[a];

  • 原信号处理函数入口地址暂存入R0,向用户态返回
3624     u.u_signal[a] = u.u_arg[1];
  • 将信号a的处理函数置为参数2
3625     if(u.u_procp->p_sig == a)

3626               u.u_procp->p_sig = 0;

  • 若当前进程 接受到的信号 为 a,则 清信号
    • 信号处理方式不一样了...原先的信号不再处理了
3627 }

3628 /* ------------------------- */

Ref

Param

(signal = 48.)
sys signal; sig; label
(old value in r0)
⚠️ **GitHub.com Fallback** ⚠️