其实在信号传递的过程中
    主要是通过内核进行传递的,比如在当前进程环境下 用户按下ctrl C ,
    这个信号是内核捕捉并传送到当前进程,然后当前进行在调用对用的 signal_handler
    之后在进行调度的!

    1. 其实就是这么简单一回事。
    • 最重要: 信号必须是内核接收并且只能由内核发送!
    • 信号只是一组向量
    • 前台进程只有一个 ,后台进程可以由多个。每个进程terminate或者stop 或正常执行完之后都会发送SIGCHLD

    所有父进程必须要阻塞SIGCHLD。
    这个时候父进程的waitpid一般也就随着子进程发送SIGCHLD返回了,然后父进程在判断

    • sigsuspend(sigset_t sigs);功能: 屏蔽新的信号,原来屏蔽的信号失效。sigsuspend是阻塞函数,对参数信号屏蔽,对参数没有指定的信号不屏蔽,但当没有屏蔽的信号处理函数调用完毕sigsuspend函数返回。
    • waitpid 和 SIGCHLD 没关系,即使是某个子进程对应的 SIGCHLD 丢失了, // 只要父进程在任何一个时刻调用了 waitpid,那么这个进程还是可以被回收的

    sigsuspend返回条件:

    1. 信号发生,并且信号是非屏蔽信号
    2. 信号必须要处理,而且处理函数返回后sigsuspend才返回。

    sigsuspend设置新的屏蔽信号,保存旧的屏蔽信号,而且当sigsuspend返回的时候,恢复旧的屏蔽信号。

    下面是tsh.c的代码
    tsh.c

    心得:
    光看真的只是表面理解了。要理解就必须通过动手去操作。

    好了 ! 下一个实验先做ProxyLab 然后在做MallocLab ! Perfect