信号
信号四要素:
- 编号
- 名称
- 事件
- 默认处理动作
– 终止
– 忽略
– 终止+产生core
– 暂停、继续
信号的特点:
- 简单
- 不能携带大量信息
- 特定条件下产生
信号也叫软件产生的中断,有可能会有延迟
信号的处理方式:
- 默认执行动作
- 忽略
- 捕捉
9,19号不能捕捉,不能忽略,甚至不能阻塞
系统api产生信号
kill函数
int kill(pid_t pid,int sig)
- pid>0 ,要发送进程ID
- pid=0,代表当前调用进程组内所有进程
- pid=-1,代表有权限发送的所有进程
- pid<0 ,代表 pid对应的组内所有进程
- sig对应的信号
raise
给自己发信号
int raise(int sig);
时钟信号
alarm
- 定时给自己发送SIGALRM
- 几秒后发送信号
- 返回值,上次闹钟剩余的描述
- 特别的,如果传入参数秒为0,代表取消闹钟
setitimer函数
周期性的发送信号
struct itimerval{
struct timeval it_interval;/ * interval for periodic timer * / 周期性的时间设置
struct timeval it_value; / * Time until next expiration * /下次的闹钟事件
}
struct timeval{
time_t tv_sec; / * seconds * / 秒
suseconds_t tv_usec; / * microseconds * / 微秒
};
int setitimer(int which,const struct itimerval *new_value,struct itmerval *old_value);
which
- ITIMER_REAL 自然定时法 SIGALARM
- ITMER_VIRTUAL 计算进程执行时间 SIGVTALRM
信号集处理函数
清空信号集
int sigemptyset(sigset_t *set);
填充信号集
int sigfillset(sigset_t *set);
添加某个信号到信号集
int sigaddset(sigset_t *set,int signum);
从集合中删除某个信号
int sigdelset(sigset_t *set,int singnum);
是否为集合里的成员
int sigismumber(const sigset_t *set,int signum);
sigismumber()返回1代表signum在集合中
设置阻塞或者接触阻塞信号集
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
- how
–SIG_BLOCK设置阻塞
–SIG_UNBLOCK接触阻塞
–SIG_SETMASK设置set为新的阻塞信号集 - set传入信号集
- oldset旧的信号集,传出
获得未决信号机
int sigpending(sigset_t *set);
- set传出参数,当前的未决信号集
打印未决信号集至屏幕
信号捕捉
防止进程意外死亡
typedef void(*sighandler_t)(int);
sighandler_t signal(int signum,sighandler_t handler);
- signum 捕捉的信号
- handler要执行的捕捉函数指针,函数应该声明void func(int);
struct sigaction {
void (*sa_handler)(int);//函数指针
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;//执行捕捉函数期间,临时屏蔽的信号集
int sa_flags;//一般填0,SA_SIGINFO会使用第二个函数指针
void (*sa_restorer)(void);//无序
};
注册捕捉函数
int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
signum捕捉的信号
act传入的动作