可重入函数
- 不含全局变量和静态变量是可重入函数的一个要素
- 可重入函数见man 7 signal
- 在信号捕捉函数里应使用可重入函数
- 在信号捕捉函数里禁止调用不可重入函数
例如:strtok就是一个不可重入函数,因为strtok内部维护了一个内部静态指针,保存上一 次切割到的位置,如果信号的捕捉函数中也去调用strtok函数,则会造成切割字符串混乱, 应用strtok_r版本,r表示可重入。
信号引起的竞态和异步I/O
时序竞态
-
int pause(void)
- 使调用进程挂起,直到有信号递达,如果递达信号是忽略,则继续挂起
-
int sigsuspend(const sigset_t *mask)
- 以通过指定mask来临时解除对某个信号的屏蔽,
- 然后挂起等待,
- 当被信号唤醒sigsuspend返回时,进程的信号屏蔽字恢复为原来的值
mysleep实现,这种实现方式是否存在BUG?
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
void sig_alrm(int signo) {
/* nothing to do */
}
unsigned int