14

这个评论让我感到困惑:“kill -l 通常列出所有信号”。我认为信号意味着量化的能量。

[已添加]请澄清 Unix 中的(计算)信号和物理信号。它们是完全不同的概念吗?

[添加]范式之间是否存在重大差异?在 C、Python 和 Haskell 等语言中的含义是否相同?信号似乎是一个通用术语。

4

11 回答 11

15

该手册是指一种非常基本的机制,它允许进程或操作系统通过发送信号来通知其他进程。操作系统可以使用它来通知程序关于它们的中止(信号SIGABRT)或分段错误(通常由访问空指针引起SIGSEGV),举出其中两个。

一些 unix 服务器使用信号,因此管理员可以使用kill向它们发送信号,导致它们重新读取其配置文件,而无需重新启动它们。

对某些信号采取了默认操作,而其他信号则被忽略。例如,在接收 aSIGSEGV时,程序终止,而在接收 aSIGCHLD时,意味着子进程死亡,默认情况下不会产生什么特别的结果。

有一个 ANSI C 标准函数,它安装了一个信号处理程序,它是一个在接收到信号时可以执行一些代码的函数,称为signal(read in man signal)。在不同的 unix 中,该函数的行为不同,因此不鼓励使用它。它的手册页引用了sigaction函数(read man sigaction),它的行为一致,也更强大。

于 2009-01-18T20:44:42.087 回答
14

我不敢相信人们在某些时候没有比较硬件和软件或强调操作系统

信号与中断的比较

不同之处在于,中断是由硬件发送给操作系统的,而信号是由操作系统或其他进程发送给进程的。请注意,信号与软件中断无关,软件中断仍由硬件(在本例中为 CPU 本身)发送。(来源)

定义

  1. 进程=正在执行的程序,根据下面的书

进一步阅读

  1. 将信号与中断和异常进行比较

  2. Tanenbaum 的《现代操作系统》一书

于 2009-08-28T16:56:09.633 回答
10

物理信号和 Unix 信号确实是不同的概念。当一个 Unix 信号从一个进程发送到另一个进程时,没有特定的对应物理信号。Unix 信号只是一种抽象,因此程序员可以谈论进程之间的通信。

Unix 信号可以被称为消息、事件、通知,甚至是像“frobs”这样的虚构术语。设计师只是选择了“信号”这个名字,然后就卡住了。

于 2009-01-18T21:58:29.817 回答
5

信号是给目标进程或给操作系统的关于目标进程的消息。它是 unix API 的一部分(并在各种 POSIX 标准中定义)。

阅读man killman signalman sigaction

其他可能有用的 SO 问题:

于 2009-01-18T20:43:00.017 回答
4

我的一些笔记:

允许异步通信

  • 属于同一用户的进程之间
  • 从系统到任何进程
  • 从系统管理员到任何进程
  • 所有相关信息都在信号本身中
  • 许多不同的信号

信号情报

  • 从系统到与终端关联的所有进程
  • 触发器:按下 ^C
  • 停止正在运行的进程的常用方法

SIGFPE

  • 从内核到单个进程
  • 触发器:浮点运算错误

杀戮

  • 到单个进程
  • 停止目标进程的执行

SIGALRM

  • 从内核到单个进程
  • 触发器:定时器到期

SIGTERM

  • 到单个进程
  • 建议进程优雅终止

SIGUSR1、SIGUSR2

  • 从任何过程到任何其他
  • 没有预定义的语义
  • 程序员可以自由使用

向另一个进程发送信号

  • int kill(pid, signal_ID)

程序员可以决定收到信号时要做什么

  • 使用默认行为
  • 忽略它
  • 执行用户函数

检测中断的写入

if (write(fd, buff, SIZE)<0) {
  switch (errno) {
   case EINTR:
    warning(“Interrupted write\n”);
    break;
  }
}…
于 2009-01-18T20:57:57.770 回答
3

信号是可以发送到正在运行的进程的消息。

例如,要告诉 Internet 守护程序 (inetd) 重新读取其配置文件,它应该发送一个 SIGHUP 信号。

例如,如果 inetd 的当前进程 ID (PID) 是 1234,您可以键入:kill -SIGHUP 1234

于 2009-01-18T20:44:18.530 回答
2

信号是“在计算过程之间传输的事件、消息或数据结构”(来自Wikipedia)。

于 2009-01-18T20:41:23.560 回答
1

在这种情况下,信号意味着“消息”。因此,它向一个进程发送一条消息,该消息可以告诉该进程做各种事情。

于 2009-01-18T20:42:39.643 回答
0

unix 信号是一种可以在 unix 进程之间发送和发送的消息。他们可以做一些事情,比如告诉一个进程退出(SIGKILL),或者一个进程有一个无效的内存引用(SIGSEGV),或者这个进程被用户点击 control-c(SIGINT)杀死。

从 *nix 命令行输入:

人信号

这将你所有可用的信号。

于 2009-01-18T20:59:46.863 回答
0

信号基本上是一个中断,它告诉进程某个特定事件已经发生。

信号一般由内核发送,同时一个进程也可以使用 kill 和 killall 命令将信号发送给其他进程(取决于权限和 all ),进程可以使用 raise 向自己发送信号。

信号的主要用途:

  1. 处理中断。

  2. 进程同步。

于 2017-03-26T11:19:05.010 回答
0
  1. 信号是一个中断,用于提示某个进程已经发生了特定事件。

  2. 信号可以由内核发送到正在运行的进程或一个进程到另一个进程。

  3. 在 bash 中使用 kill 和 killall 命令发送信号。

于 2018-04-04T04:58:32.533 回答