本文总结Linux环境中的信号相关知识以及和信号相关的接口的使用方法。

1.1 信号的基本概念

信号是软中断的一种,是典型的异步事件处理机制之一。因为产生信号的时间时随机出现的,没有任何规律。
当某个信号出现时,可以告诉内核按照如下3种方式处理,称为信号处理:

  1. 忽略信号
    大多数信号可以采用这种方式。但是SIGKILL(9)和SIGSTOP(19)这两个信号不能忽略。

  2. 捕捉信号 为了捕捉信号,需要通知内核在某种信号发生时,调用一个用户函数。在用户函数中,用户事先定制了该信号发生时要执行的操作。

  3. 执行系统的默认动作
    操作系统为每种信号设置默认的操作。但是大多数信号的系统默认操作都是终止进程。

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

1.3 信号相关函数

1.4 自定义信号处理函数