1.可重入函数
- 概念:第一次调用还没结束,就发生第二次调用,结果还不出错。
- 所有的系统调用都是可重入的,一部分标准库函数也是可重入的,eg:memcpy,rand()函数是不可重入的(在上次德基础上计算一个随机值),而rand_r()是可重入的。
2.信号的响应过程
- 内核为每个进程维护了2个位图:mask和pending(理论上32位)。
- mask一般都是1,pending一般都是0
- 如何忽略掉一个信号?标准信号,为什么会丢失?
- 信号来时,对应的pending位置为1,中断打断,然后进入内核态,排队调度。从内核态返回用户态时,mask与pending按位与,发现信号,响应的时候mask与pending置为0(若此时信号又来了,则pending又被置为1,若来了很多次,也是置为1,不会计数),执行处理函数,返回内核,将mask位置为1,再做一次按位与。因此:信号从收到到响应,有一个不可避免的延迟。
- 标准信号的响应没有严格的顺序
- 若mask位置为0,则永远无法响应信号。
3.常用函数
- kill()函数。
- rsise()函数。
- alarm()函数:
\\ alarm.c
#include <stdio.h>
#include <stdlib.h>
int main(){
alarm(5);
while(1);
exit(1);
}
\\ alarm2.c
#include <stdio.h>
#include <stdlib.h>
int main(){
alarm(10);
alarm(1);
alarm(5);
while(1);
exit(1);
}
- alarm()无法实现多个计时。
- pause()函数:alarm函数cpu满占,盲等。pause()不会盲等。
\\ pause.c
#include <stdio.h>
#include <stdlib.h>
int main(){
alarm(10);
alarm(1);
alarm(5);
while(1)
pause();
}
- sleep 可能由pause()和alarm()来实现。
- 66集
网友评论