📜  信号基本类型(1)

📅  最后修改于: 2023-12-03 15:22:28.237000             🧑  作者: Mango

信号基本类型

在操作系统中,信号是一种事件,它通常用于通知进程发生了某个特定的事件,比如收到了某个信号。在Unix-like系统中,信号是一种软件中断,与硬件中断不同。在本文中,我们将介绍Linux中的信号基本类型。

信号编码

Linux中的信号是一个整数,表示发送的信号编号。在Linux中,信号编号从1开始到64结束,其中一些信号是固定的,而其他则可以被用户定义(信号值从1到31)。信号的编号定义在/usr/include/asm-generic/signal.h头文件中。

信号种类

Linux中共有64种信号。其中比较常用的有:

  • SIGTERM:终止进程。该信号通常由管理员发送给进程以请求其正常终止。
  • SIGKILL:强制终止进程。该信号不能被进程捕获或阻止,在进程收到该信号后会立即终止。
  • SIGHUP:挂起进程。当进程的终端关闭时,该信号通常会被发送。
  • SIGINT:中断进程。当用户在控制台上按下Ctrl+C时,该信号通常会被发送。
信号处理

当进程接收到信号时,可以执行以下操作之一:

  • 忽略信号。该操作通过调用signal函数并将处理程序设置为SIG_IGN来实现。
  • 执行默认操作。该操作是由操作系统执行的,通常是终止进程或挂起进程。
  • 执行自定义操作。该操作通过调用signal函数并将处理程序设置为一个自定义的函数指针来实现。
信号传递

信号可以通过以下方式传递:

  • 发送给整个进程组。该操作通常由管理员执行,用于向进程中所有进程发送信号。
  • 发送给单个进程。该操作通常由操作系统或其他进程执行。
信号阻塞

有时,我们不希望在接收到某个信号时立即执行信号处理程序。此时,我们可以将该信号添加到阻塞信号集中,该信号集由通过调用sigprocmask函数设置。阻塞信号集中的信号在进程接收到信号前不会被处理。

信号屏蔽

有时,我们希望在某些情况下忽略信号。此时,我们可以将该信号添加到信号屏蔽集中,该信号集由通过调用sigprocmask函数设置。信号屏蔽集中的信号在进程接收到信号前不会被处理。

信号队列

当进程接收到多个相同的信号时,这些信号将被合并成一个信号。如果进程阻塞了该信号,则所有合并的信号将被排队等待处理。否则,只有一个信号将被处理,其他将被忽略。

技巧提示
  • 信号的处理程序应该简短,否则可能会发生问题。
  • 应该尽量避免在信号处理程序中使用诸如printf之类的函数,因为它们不是可重入的。
  • 信号在高负载下启动会出现延迟,因此在编写信号处理程序时要考虑到这一点。
参考