unix环境编程·信号特性

来源:互联网 发布:三角形最短路径java 编辑:程序博客网 时间:2024/04/30 03:58

1. 启动一个程序对信号的影响

执行一个程序时候,信号状态是默认或忽略的则exec时不改变动作,若在exec前捕获了一个信号,那么exec时将还原此信号为默认动作,信号捕获函数的地址在新程序中已无意义。例如:signal(SIGINT,SIG_IGN);execlp("sol",NULL);在shell内部编译此代码运行时,会启动sol游戏,但在shell中按下ctrl+c无法使游戏中断,因为SIGINT在exec前被显式忽略了,SIG_IGN在新程序中有意义。

2. 创建一个进程

当一个进程调用fork时,其子进程继承父进程的处理方式,因为子进程复制了父进程的存储映像,所有信号捕获函数的地址在子进程中是有意义的。

3. 中断的系统调用重启动

当进程因执行低速系统调用而阻塞时(即进程进入了TASK_INTERRUPTIBLR状态),某个进程向它发送了一个信号,那么内核解除进程的阻塞,这就标志着系统调用未成功执行,那么内核可能会需要自动重启动系统调用,那么如何重新启动就跟信号有关系了,如果信号是默认或忽略动作,则会自动重启动,如果信号被捕获,只有信号的SA_RESTART标志被设置,才重新执行系统调用。

4. 中断进程执行,可重入函数

信号就像中断函数一样,会随机的中断进程的执行,如果进程正在执行一个不可重入的函数时产生一个信号,在信号处理程序内部又调用此不可重入函数,这时候就会出现竞争。如果进程正在以非可重入方式更新数据结构,这时候产生信号并执行siglongjmp,则数据结构只进行了部分更新。对于这两种情况就需要选择性的屏蔽某些信号,就像关中断一样,对正常执行和中断函数中都有操作的数据结构,就需要关中断保护。

5. SIGCHLD信号

子进程在终止时是否需要保留僵死状态,可以有SIGCHLD信号决定,在父进程中使用sigaction设置SIGCHLD的SA_NOCLDWAIT可以避免子进程僵死。

6. 信号可以被阻塞(递送阻塞)

每个进程都有一个信号屏蔽字,它规定了当前要阻塞递送到该进程的信号集。如果在某个信号阻塞期间产生了此信号,内核会保持此信号,知道该信号解除阻塞。信号的产生会置位进程中的某个标志位,信号在将要执行时(即信号的递送)会判断信号是否是阻塞的,如果阻塞则不递送此信号,这就是保持此信号直到解除阻塞的机密,将阻塞判断放在了信号执行时。

7. 进程给其他进程发送信号的权限

超级用户可以将进程发送给任一进程。对于非超级用户,发送者的实际或有效用户ID必须等于接受者的实际或有效用户ID。kill函数是个系统调用,那么用kill函数向进程自身产生信号时,在系统调用返回时就会处理信号。信号的执行点是在中断返回前,系统调用是软中断,在返回前会执行信号。

0 0
原创粉丝点击