涉及主要函数
signal sigaction alarm pause sigpromask sigemptyset sigaddset sigpending sigsetjmp siglongjmp setitimer
int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact);
根据参数signum可以指定SIGKILL和SIGSTOP以外的所有信号,sigaction()会依参数signum指定的信号编号来设置该信号的处理函数。
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue));
触发SIGALRM信号
int which:
ITIMER_REAL : 以系统真实的时间来计算,它送出SIGALRM信号。
ITIMER_VIRTUAL : -以该进程在用户态下花费的时间来计算,它送出SIGVTALRM信号。
ITIMER_PROF : 以该进程在用户态下和内核态下所费的时间来计算,它送出SIGPROF信号。
const struct itimerval *value:
指定间隔时间
sttuct itimerval *ovalue:
返回上一次定时器的间隔时间,如果不关心该值可设为NULL。
涉及主要结构体
struct sigaction
{
void (*sa_handler)(int); //类似signal的信号处理函数
void (*sa_sigaction)(int,siginfo_t *,void *); //更加详细的信号处理函数
sigset_t sa_mask; //信号集合
int sa_flags; //信号处理行为
void (*sa_restorer)(void); //过时的不需要在使用
}
int sa_flags:
SA_RESTART:使被信号打断的系统调用自动重新发起。
SA_NOCLDSTOP:使父进程在它的子进程暂停或继续运行时不会收到 SIGCHLD 信号。
SA_NOCLDWAIT:使父进程在它的子进程退出时不会收到 SIGCHLD 信号,这时子进程如果退出也不会成为僵尸进程。
SA_NODEFER:使对信号的屏蔽无效,即在信号处理函数执行期间仍能发出这个信号。
SA_RESETHAND:信号处理之后重新设置为默认的处理方式。
SA_SIGINFO:使用 sa_sigaction 成员而不是 sa_handler 作为信号处理函数。
sigset_t sa_mask:
信号集合
配合函数 sigpromask sigemptyset sigaddset
sigemptyset(&sa.sa_mask);//初始化信号集合
sigpromask(SIG_UNBLOCK,&sa.sa_mask,&oldset);//取消阻塞信号 将原来的结果存放在oldset中 当程序结束是还原
SIG_BLOCK:增加一个信号集合到当前进程的阻塞集合之中.
SIG_UNBLOCK:从当前的阻塞集合之中删除一个信号集合.
SIG_SETMASK:将当前的信号集合设置为信号阻塞集合.
sigaddset(&sa.sa_mask,SIGALRM);//在集合中添加信号
struct itimerval
{
struct timeval it_interval; //间隔时间
struct timeval it_value; //定时时间
}
struct timeval
{
long tv_sec;//秒
long tv_usec;//微妙
}
siginfo_t //这也是个结构体
{
int si_code;//信号来源(比如user kernel)
int si_signo;//信号号
.........还有好多
}