可重入函数

  可重入函数是指在任何时候任何地方调用都能保证安全的函数,无论是线程还是信号处理函数,函数一般没有共享变量或者锁之类的东西

  被不同的控制流程调用,有可能在第一次调用还没返回时就再次进入该函数这称为重入,访问一个全局对象,有可能因为重入而造成错乱,像这样的函数称为不可重入函数,反之,如果一个函数只访问自己的局部变量或参数,则称为可重入(Reentrant)函数。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

不可重入的原因:

  1. 已知它们使用静态数据结构
  2. 它们调用malloc和free因为malloc通常会为所分配的存储区维护一个链接表,而插入执行信号处理函数的时候,进程可能正在修改此链接表。
  3. 它们是标准IO函数。因为标准IO库的很多实现都使用了全局数据结构

  一个信号处理器中中能在调用的函数

accept fchmod lseek sendto stat
access fchown lstat setgid symlink
aio_error fcntl mkdir setpgid sysconf
aio_return fdatasync mkfifo setsid tcdrain
aio_suspend fork open setsockopt tcflow
alarm fpathconf pathconf setuid tcflush
bind fstat pause shutdown tcgetattr
cfgetispeed fsync pipe sigaction tcgetpgrp
cfgetospeed ftruncate poll sigaddset tcsendbreak
cfsetispeed getegid posix_trace_event sigdelset tcsetattr
cfsetospeed geteuid pselect sigemptyset tcsetpgrp
chdir getgid raise sigfillset time
chmod getgroups read sigismenber timer_getoverrun
chown getpeername readlink signal timer_gettime
clock_gettime getpgrp recv sigpause timer_settime
close getpid recvfrom sigpending times
connect getppid recvmsg sigprocmask umask
creat getsockname rename sigqueue uname
dup getsockopt rmdir sigset unlink
dup2 getuid select sigsuspend utime
execle kill sem_post sleep wait
execve link send socket waitpid
_Exit & _exit listen sendmsg socketpair write

异步信号安全函数

  所有的I/O函数和pthread_XXX函数都不可在信号处理程序中调用,Unix网络编程2中所有的IPC函数只有sem_post,read,write(read和write只作用于管道和FIFO时)可以

  信号安全函数是在信号处理函数中可以安全调用的函数

_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()  signal()  sigpause()  sigpending()  sigprocmask()  sigqueue()
sigset()  sigsuspend()  sleep()  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()

线程安全函数

  线程安全函数是指多个线程同时调用此函数,能保证安全执行,显然可重入函数只是线程安全函数的一个子集。
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄