`
zhangyafei_kimi
  • 浏览: 261555 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

异步信号安全的posix函数(备忘)

阅读更多
可重入就是异步信号安全。可重入的要求比多线程安全更严格。
crt的io函数和malloc、free函数都不是可重入的。但是有的字符串处理函数可重入。


满足下列条件的函数是不可重入的:
    1) 函数体内使用了静态的数据结构;
    2) 函数体内调用了malloc() 或者free() 函数;
    3) 函数体内调用了标准I/O 函数。


如何编写可重入的函数:
    1) 不要使用全局变量。因为别的代码很可能覆盖这些变量值。
    2) 不能调用其它任何不可重入的函数。
    3) 在和硬件发生交互的时候,切记执行类似disinterrupt() 之类的操作,就是关闭硬件中断。完成交互记得打开中断,在有些系列上,这叫做“ 进入/ 退出核心” 。
    4) 谨慎使用堆栈。最好先在使用前先OS_ENTER_KERNAL 。



记录一下异步信号安全(可重入)的系统调用:
_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()
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()
sleep()
signal()
sigpause()
sigpending()
sigprocmask()
sigqueue()
sigset()
sigsuspend()
sockatmark()
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()
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics