1、可重入函数
可重入函数指的是可以被中断的函数。也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。I/O代码通常不是可重入的,因为它们依赖于像磁盘这样共享的,单独的资源。
2、可重入的条件
不含有静态(全局)非常量数据
不返回静态(全局)非常量数据的地址
只处理由调用者提供的数据
不能依赖于单例模式(Singleton)资源的锁
不能调用不可重入的函数
不能修改函数本身(除非执行在其专有的存储空间)
3、可重入函数与线程安全的函数
线程安全的函数加入同步机制保护共享资源。所有的可重入函数都是线程安全的,反之不成立。
4、Linux的可重入函数
_exit & _Exit & exit* | abort* | accept | access | aio_error | aio_return |
aio_suspend | alarm | bind | cfgetispeed | cfgetospeed | cfsetispeed |
cfsetospeed | chdir | chmod | chown | clock_gettime | close |
connect | creat | dup | dup2 | execle | execve |
fchmod | fchown | fcntl | fdatasync | fork | fpathconf |
fstat | fsync | ftruncate | getegid | geteuid | getgid |
getgroups | getpeername | getpgrp | getpid | getppid | getsockname |
getsockopt | getuid | kill | link | listen | longjmp* |
lseek | lstat | mkdir | mkfifo | open | pathconf |
pause | pipe | poll | posix_trace_event | pselect | raise |
read | readlink | recv | recvfrom | recvmsg | rename |
rmdir | select | sem_post | send | sendmsg | sendto |
setgid | setpgid | setsid | setsockopt | setuid | shutdown |
sigaction | sigaddset | sigdelset | sigemptyset | sigfillset | sigismember |
signal* | sigpause | sigpending | sigprocmask | sigqueue | sigset |
sigsuspend | sleep | socket | socketpair | stat | symlink |
sysconf | tcdrain | tcflow | tcflush | tcgetattr | tcgetpgrp |
tcsendbreak | tcsetattr | tcsetpgrp | time | timer_getoverrun | timer_gettime |
timer_settime | times | umask | uname | unlink | utime |
wait | waitpid | write |