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
dupdup2
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
ps:以上函式的可重入性也不是絕對的(比如read,recv......都會修改errno)
Linux 可重入函式 不可重入函式
當我們在使用malloc函式的時候,如果有訊號中斷了我們malloc操作,假設malloc剛剛從堆上的空閒鏈上找到合適的位置,結果打斷後去執行其他操作,剛好其他操作裡也有malloc,也恰好找到了剛剛malloc的地方,把那個空間從空閒空間鏈上取下,然後其他操作結束,返回。此時主函式內的那個mall...
Linux 可重入函式與不可重入函式
函式是一段載入到記憶體的 函式的 可長可短,執行時間長度也不確定。在多執行緒中,執行緒之間是可以進行切換的。函式是一段寫好的 屬於程式公有的 段。乙個程序中有多個執行緒,每乙個執行緒都可以呼叫這段函式 執行。而在多執行緒環境中,執行緒的切換是無法預料的,你不知道下一秒是哪個執行緒在執行,每時每刻的執...
可重入函式 可重入核心
可重入函式這一概念早有接觸,但一直未有系統的理解,最近閱讀 apue 訊號一章時,其中講解很到位,故總結如下。訊號作為一種軟中斷,能夠被程序給捕獲,因而也就中斷程序的正常執行,轉而去執行訊號處理程式,最後再返回到原程序繼續正常執行。然而,當程序正在執行 malloc 動態記憶體分配時,訊號產生從而轉...