异步事件处理:查询法(频率高的事件)、通知发(频率低的事件)
一、信号
- 信号的概念
- 信号是软件层面的中断
- 信号的响应依赖于中断
- kill -l:1-31,标准信号, 34以后,实时信号
- 标准信号会丢失, 实时信号不会
- signal()
- void (*signal(int signum, void (*func)(int))) (int);
- 信号会打断阻塞的系统调用
- 信号的不可靠
- 信号的行为不可靠,执行现场是内核布置的,有可能第一次调用还没结束时就发生了第二次调用。
- 可重入函数
- 第一次调用还没结束又发送了第二次调用,但是不影响第二次函数调用的功能。
- 所有的系统调用都是可重入的。
- 信号的响应过程
- 思考:如何忽略掉一个信号的?标准信号为什么丢失?
- 把mask位(信号屏蔽字)置为0。
- 因为用位图,响应信号后会把mask置0,后续收到的信号都只会把pending置为1,按位与后还是0。
- 标准信号的响应没有严格的顺序
- 信号从收到到响应有一个不可避免的延迟:因为刚收到信号只是把pending字段置为1,要有中断的打断才能对信号作出响应。
- 信号是在从kernal到user路上被响应的(由于中断机制会使user态到kernal态)
- 不能从信号处理函数中随意的往外跳。(setjmp, longjmp)可能会错过把mask置为1的过程。
- 思考:如何忽略掉一个信号的?标准信号为什么丢失?
- 常用函数
- kill();发送信号
- raise(); 自己给自己发信号
- alarm();时间相关
- pause();等待信号
- abort()
- system()
- sleep
- 信号集
- 信号集类型:sigset_t
- sigemptyset()
- sigfillset()
- sigaddset()
- sigdelset()
- sigismember()
- 信号屏蔽字/pending集的处理
- sigprocmask()
- sigpending()
- 扩展
- sigsuspend()
- sigaction()
- setitimer()
- 实时信号
二、线程
- 线程属性
- pthread_attr_init()、pthread_attr_destroy()、pthread_attr_setstacksize()
- 线程同步的属性
- 互斥量属性(条件变量同理、读写锁)
- pthread_mutexattr_init();
- pthread_mutexatr_destroy()
- pthread_mutex_getpshared(); 是否跨进程其作用
- pthread_mutex_setpshared()
- clone()
- pthread_mutexattr_gettype()
- pthread_mutexattr_settype()
- 互斥量属性(条件变量同理、读写锁)
- 重入
- 多线程中的IO(使用的基本都是线程安全的)
- 线程与信号
- ptrhread_sigmask()
- sigwait()
- pthread_kill()
- 线程与fork
- posix中子进程中只含fork该子进程的线程。