15-确保可重入的函数
确保可重入的函数
当写信号处理程序时,你必须假定中断的进程可能处于不可重入的函数中(或者其他方面)。因此,信号处理程序必须只使用可重入函数。
很多标准已经颁布了信号安全(即可重入)的函数列表,因此可在信号处理程序中安全使用。最值得注意的是,POSIX.1-2003和UNIX信号规范规定了在所有标准平台上都保证可重入和信号安全函数的列表。表10-3列出了这些函数。
| 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() | _Exit() | | _exit() | 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() | 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() |
当然,有更多的函数是安全的,但是Linux以及其他POSIX标准兼容的系统只保证以上这些函数是可重入的。