可重入函数
如果一个函数能被多个线程同时调用且不发生竞态,他就是线程安全的,或称为可重入的。
被不同的控制流程调用,有可能在第一次调用还没返回时就再次进入该函数这称为重入,访问一个全局对象,有可能因为重入而造成错乱,像这样的函数称为不可重入函数,反之,如果一个函数只访问自己的局部变量或参数,则称为可重入(Reentrant)函数。
不可重入的原因:
- 已知它们使用静态数据结构
- 它们调用malloc和free因为malloc通常会为所分配的存储区维护一个链接表,而插入执行信号处理函数的时候,进程可能正在修改此链接表。
- 它们是标准IO函数。因为标准IO库的很多实现都使用了全局数据结构
一个信号处理器中中能在调用的函数
accept | fchmod | lseek | sendto | stat |
access | fchown | lstat | setgid | symlink |
aio_error | fcntl | mkdir | setpgid | sysconf |
aio_return | fdatasync | mkfifo | setsid |