【跪求解答】关于信号处理函数的有关问题

【跪求解答】关于信号处理函数的问题

void sig_tstp(int signo) {
    sigset_t mask;
    /* do something 1 */
    
    sigemptyset(&mask);
    sigaddset(&mask, SIGTSTP);
    sigprocmask(SIG_UNBLOCK, &mask, NULL);
    //1.这里如果这时候来了一个SIGTSTP信号那么,信号还没有设置成默认不是还会进入sig_tstp函数么?
    //这里是否应该这样写
    /*
      signal(SIGTSTP, SIG_DFL);
     
      sigemptyset(&mask);
      sigaddset(&mask, SIGTSTP);
      sigprocmask(SIG_UNBLOCK, &mask, NULL);
      
      kill(getpid(),SIGTSTP);
     */
    signal(SIGTSTP, SIG_DFL);
    
    kill(getpid(), SIGTSTP);//向自己发送停止信号
    //2.如果信号的发送延迟比较大那么,是否会再SIGTSTP没有停止进程之前就执行了下面的 do something 2
    
    //3.这里如果这时候来了一个SIGTSTP信号那么,信号还没有设置成sig_tstp不是还会进入默认处理么?
    signal(SIGTSTP, sig_tstp);
    
    /* do something 2 */
}


这个是我在《UNIX环境高级编程 第三版》P302页的10-31程序看到的,是处理vi停止后重新绘制终端的,有以上三点不理解的地方请大侠们帮解答下。
------解决思路----------------------
那个测试程序结果为啥是这样呢【跪求解答】关于信号处理函数的有关问题

不理解啊,但是把
sigemptyset(&mask);
    sigaddset(&mask, SIGTSTP);
    sigprocmask(SIG_UNBLOCK, &mask, NULL);
改到main里,就符合我的预期了
照理来说信号处理中再有信号应该是未决的啊
难道我理解错误了【跪求解答】关于信号处理函数的有关问题
还是sigprocmask 这个函数有啥别的奇葩的作用?