可再入函数
可再入函数进程捕捉到信号并继续执行时,它首先执行该信号处理程序中的指令。如果从信号处理程序返回(例如没有调用exit或longjmp),则继续执行在捕捉到信号时进程正在执行的正常指令序列(这类似于硬件中断发生时所做的)。但在信号处理程序中,不能判断捕捉到信号时进程执行到何处。如果进程正在执行malloc,在其堆中分配另外的存储空间,而此时由于捕捉到信号插入执行该信号处理程序,其中又调用malloc,这时会发生什么?又例如若进程正在执行getpwnam(见6.2节)这种将其结果存放在静态存储单元中的函数,而插入执行的信号处理程序中又调用这样的函数,这时又会发生什么呢?在malloc例中,可能会对进程造成破坏,因为malloc通常为它所分配的存储区保持一个连接表,而插入执行信号处理程序时,进程可能正在更改此连接表。在getpwnam的例子中,正常返回给调用者的信息可能由返回至信号处理程序的信息覆盖。POSIX.1说明了保证可再入的函数。表10-3列出了这些可再入函数。图中四个带*号的函数并没有按POSIX.1说明为是可再入的,但SVR4 SVID 〔AT&T 1989〕则将它们列为是可再入的。
想知道更多关于POSIX标准文档的信息吗?你可以通过以下链接深入了解:POSIX标准文档、ISO POSIX Linux Unix标准C函数速查手册、POSIX最新标准文档和POSIX1003标准文档。这些文档还可以在线浏览:POSIX标准文档在线浏览。有了这些资源,你还会担心了解不到POSIX标准的最新内容吗?
表10-3信号处理程序中可以调用的可再入函数:
-
exit
-
fork
-
pipe
-
stabort *
-
fstat
-
read
-
sysconf
-
access
-
getegid
-
rename
-
tcdrain
-
alarm
-
geteuid
-
rmdir
-
tcflow
-
cfggetispeed
-
getgid
-
setgid
-
tcflush
-
cfggetospeed
-
getgroups
-
setpgid
-
tcgetattr
-
cfsetispeed
-
getpid
-
setuid
-
tcgetpgrp
-
cfsetospeed
-
getpgrp
-
setsid
-
tcsetattr
-
cfsetispeed
-
getuid
-
sigaction
-
tcsetpgrp
-
cfsetospeed
-
getppid
-
sigaddset
-
tcsetpgrp
-
chmod
-
kill
-
sigdelset
-
time
-
close
-
link
-
sigemptyset
-
times
-
creat
-
longjmp *
-
sigfillset
-
umask
-
dup
-
lseek
-
sigismember
-
uname
-
dup2
-
mkdir
-
signal *
-
unlink
-
execl
-
mkfifo
-
sigpending
-
utime
-
execve
-
open
-
sigprocmask
-
wait
-
exit *
-
pathconf
-
sigsuspend
-
waitpid
-
fcntl
-
pause
-
sleep
-
write
从这些函数中可以看出,POSIX标准中对可再入函数有着严格的定义和分类。对于那些从事相关开发工作的人士来说,掌握这些信息无疑是至关重要的。