在另一篇文章Linux信号中,介绍了信号的产生与处理方式,以及一系列信号集函数的使用。
本文使用信号机制,模拟实现sleep函数并了解竞态条件。
在此之前先介绍一波需要用到的函数。
sigaction函数
#include <signal.h>
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
可以读取和修改于指定信号相关联的处理动作。
参数 signnum 为指定信号的编号。
若act指针非空,则根据 act 修改信号的处理动作,oldact可以为空,或者传出原来的处理动作。act和oldact都指向下面的结构体:
struct sigaction
{
void (*sa_handler) (int) // 信号处理函数 SIG_IGN 表示忽略 SIG_DFL 表示默认动作
sigset_t sa_mask; // 额外要屏蔽信号集
int sa_flags; // 一般为0
void (*sa_sigaction)(int, siginfo_t *, void *); // 实时信号处理函数
}
当某个信号的处理函数被调用时,内核自动将当前信号加入进程的信号屏蔽字,当信号处理函数返回时自动恢复原来的信号屏蔽字。保证在处理某个信号时,如果这种信号再次产生,那么它会被阻塞到当前处理结束为止。如