Linux可重入函式

2021-07-07 08:54:22 字數 2300 閱讀 3479

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 動態記憶體分配時,訊號產生從而轉...