Linux 信号

linux 系统的进程间通信(inter-process communication, ipc)机制包括6种主要类型:

管道(PIPE)、信号(signal)、命名管道(FIFO)、消息队列(Message Queue)、套接字(Socket)和共享内存(Shared Memory)。信号(Signal)是 unix 系统中最早使用的进程间通信机制,linux 作为 UNIX 的继承者,也支持这一机制。信号通过向一个或多个进程发送异步事件信号来实现,可以由键盘输入或访问不存在的位置等触发;信号通过 shell 将任务发送给子进程。

Linux 信号在 Linux 系统中,你可以通过输入 kill -l 命令来列出系统支持的信号列表,以下是一些常见的信号:

Linux 信号进程可以选择忽略接收到的信号,但有两个信号是无法忽略的:SigsTOP 和 SIGKILL。SIGSTOP 信号会通知当前运行的进程停止执行,SIGKILL 信号会通知当前进程立即终止。除此之外,进程可以选择处理它想要处理的信号,也可以选择阻止信号。如果不阻止,可以选择自行处理或让内核进行默认处理。

操作系统会中断目标程序的进程以发送信号,在任何非原子指令中,执行都可以被中断。如果进程已经注册了信号处理程序,则执行该程序;如果没有注册,则采用默认处理方式。

例如:当进程收到 SIGFPE 浮点异常信号时,默认操作是进行转储(dump)并退出。信号没有优先级之分。如果同时为某个进程产生了两个信号,可以将它们按任意顺序呈现给进程或处理。

接下来我们详细了解这些信号的用途:

SIGABRT 和 SIGIOT:这两个信号发送给进程,指示其终止。通常在调用 C 标准库的 abort() 函数时由进程本身触发。

SIGALRM、SIGVTALRM、SIGPROF:当设置的时钟功能超时时,会将这些信号发送给进程。SIGALRM 在实际时间或时钟时间超时时发送,SIGVTALRM 在进程使用的 CPU 时间超时时发送,SIGPROF 在进程和系统代表进程使用的 CPU 时间超时时发送。

SIGBUS:当发生总线中断错误时发送给进程。

SIGCHLD:当子进程终止、被中断或恢复时,将此信号发送给进程。常用于指示操作系统在子进程终止后清理其使用的资源。

SIGCONT:SIGCONT 信号指示操作系统继续执行先前由 SIGSTOP 或 SIGTSTP 信号暂停的进程,常用于 Unix shell 中的作业控制。

SIGFPE:在执行错误的算术运算(如除以零)时发送给进程。

SIGHUP:当控制终端关闭时发送给进程。许多守护进程会重新加载配置文件并重新打开日志文件,而不是在收到此信号时退出。

SIGILL:在尝试执行非法、格式错误、未知或特权指令时发出。

SIGINT:当用户希望中断进程时,操作系统会发送此信号。用户按下 Ctrl-C 即是希望中断进程。

SIGKILL:此信号发送给进程以使其立即终止。与 SIGTERM 和 SIGINT 不同,此信号无法被捕获和忽略,进程在接收到此信号后无法执行任何清理操作。一些例外情况包括:

  • 僵尸进程无法被杀死,因为它们已经死亡,等待父进程捕获。
  • 处于阻塞状态的进程只有在被唤醒后才能被杀死。
  • init 进程是 Linux 的初始化进程,它会忽略任何信号。

SIGKILL 通常作为最后杀死进程的信号,常用于 SIGTERM 没有响应时发送给进程。

SIGPIPE:当尝试写入进程管道时发现管道未连接且无法写入时发送给进程。

SIGPOLL:当在明确监视的文件描述符上发生事件时发送此信号。

SIGRTMIN 至 SIGRTMAX:这些是实时信号。

SIGQUIT:当用户请求退出进程并执行核心转储时,由其控制终端发送给进程。

SIGSEGV:当进程做出无效的虚拟内存引用或分段错误时发送给进程。

SIGSTOP:指示操作系统终止进程以便以后恢复。

SIGSYS:当错误参数传递给系统调用时发送给进程。

SIGTERM:此信号发送给进程以请求终止。与 SIGKILL 不同,此信号可以被进程捕获或忽略,允许进程执行良好的终止,释放资源并在适当时保存状态。SIGTERM 与 SIGINT 几乎相同。

SIGTSTP:由其控制终端发送给进程,以请求终端停止。

SIGTTIN 和 SIGTTOU:当进程在后台尝试从 tty 读取或写入时分别发送给进程。

SIGTRAP:在发生异常或 trap 时发送给进程。

SIGURG:当套接字具有可读取的紧急或带外数据时发送给进程。

SIGUSR1 和 SIGUSR2:这些信号发送给进程以指示用户定义的条件。

SIGXCPU:当进程耗尽 CPU 的时间超过某个用户可设置的预定值时发送给进程。

SIGXFSZ:当进程生成的文件大小超过最大允许值时发送给进程。

SIGWINCH:当其控制终端更改大小(窗口更改)时发送给进程。

SIGHUP:当用户终端连接(正常或非正常)结束时发出,通常在终端的控制进程结束时通知同一 Session 内的各个作业。这时它们与控制终端不再关联。登录 Linux 时,系统会为登录用户分配一个终端(Session)。在这个终端运行的所有程序,包括前台进程组和后台进程组,一般都属于这个 Session。当用户退出 Linux 登录时,前台进程组和后台有对终端输出的进程将会收到 SIGHUP 信号。默认操作是终止进程,因此前台进程组和后台有终端输出的进程就会中止。不过,进程可以捕获这个信号,比如 wget 可以捕获 SIGHUP 信号并忽略它,这样即使退出了 Linux 登录,wget 也能继续下载。此外,对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件。

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享