信号
文章目录
本文总结Linux环境中的信号相关知识以及和信号相关的接口的使用方法。
1.1 信号的基本概念
信号是软中断的一种,是典型的异步事件处理机制之一。因为产生信号的时间时随机出现的,没有任何规律。
当某个信号出现时,可以告诉内核按照如下3种方式处理,称为信号处理:
-
忽略信号
大多数信号可以采用这种方式。但是SIGKILL(9)和SIGSTOP(19)这两个信号不能忽略。 -
捕捉信号 为了捕捉信号,需要通知内核在某种信号发生时,调用一个用户函数。在用户函数中,用户事先定制了该信号发生时要执行的操作。
-
执行系统的默认动作
操作系统为每种信号设置默认的操作。但是大多数信号的系统默认操作都是终止进程。
1.2 异步信号安全函数(可重入)
不可重入函数的特征:
- 使用了静态数据结构的函数
- 调用malloc()或free()的函数
- 标准IO函数
1.2.1 Linux系统异步信号安全函数
| abort | faccessat | linkat | select | socketpair |
| accept | fchmod | listen | sem_post | stat |
| access | fchmodat | lseek | send | symlink |
| aio_error | fchown | lstat | sendmsg | symlinkat |
| aio_return | fchownat | mkdir | sendto | tcdrain |
| aio_suspend | fcntl | mkdirat | setgid | tcflow |
| alarm | fdatasync | mkfifo | setpgid | tcflush |
| bind | fexecve | mkfifoat | setsid | tcgetattr |
| cfgetispeed | fork | mknod | setsockopt | tcgetpgrp |
| cfgetospeed | fstat | mknodat | setuid | tcsendbreak |
| cfsetispeed | fstatat | open | shutdown | tcsetattr |
| cfsetospeed | fsync | openat | sigaction | tcsetpgrp |
| chdir | ftruncate | pause | sigaddset | time |
| chmod | futimens | pipe | sigdelset | timer_getoverrun |
| chown | getegid | poll | sigemptyset | timer_gettime |
| clock_gettime | geteuid | posix_trace_event | sigfillset | timer_settime |
| close | getgid | pselect | sigismember | times |
| connect | getgroups | raise | signal | umask |
| creat | getpeername | read | sigpause | uname |
| dup | getpgrp | readlink | sigpending | unlink |
| dup2 | getpid | readlinkat | sigprocmask | unlinkat |
| execl | getppid | recv | sigqueue | utime |
| execle | getsockname | recvfrom | sigset | utimensat |
| execv | getsockopt | recvmsg | sigsuspend | utimes |
| execve | getuid | rename | sleep | wait |
| _Exit | kill | renameat | sockatmark | waitpid |
| _exit | link | rmdir | socket | write |