【问题标题】:Are the signals in the C standard library <signal.h> signals in OS?C 标准库 <signal.h> 中的信号是 OS 中的信号吗?
【发布时间】:2015-12-07 16:20:28
【问题描述】:

在C标准库的&lt;signal.h&gt;中,有效信号包括

SIGABRT  abnormal termination, e.g., from abort 
SIGFPE   arithmetic error, e.g., zero divide or overflow 
SIGILL   illegal function image, e.g., illegal instruction 
SIGINT   interactive attention, e.g., interrupt 
SIGSEGV  illegal storage access, e.g., access outside memory limits 
SIGTERM   termination request sent to this program 

它们是在操作系统(例如 Linux)中实现的相同信号吗?我的意思是操作系统中实现的信号被操作系统用来通知进程,它独立于C标准库,处于C编程语言和C标准库的较低级别。

为了使我的问题更清楚(尽可能),让我做一个类比。 C++ 中的异常及其处理与操作系统中的中断及其处理不同。后者在 OS 中实现,独立于 C++ 编程语言,低于 C++。

【问题讨论】:

  • 没有“规则”说它们是相同的 - C 信号源自它们的创世硬件,因此与该机器的汇编语言相关。不应做任何假设。

标签: c operating-system signals


【解决方案1】:

是的,它们是相同的,至少 Linux 支持 C 信号,不一定相反。在古代,C 语言和 UNIX 函数(又称系统调用)之间并没有明显的区别;请记住,C 是为编写 UNIX 而设计的。

C 标准 7.14 4/

实现不需要生成任何这些信号,除非作为 显式调用 raise 函数的结果。附加信号和 指向不可声明函数的指针,以宏定义开头, 分别用字母 SIG 和大写字母或 SIG_ 和一个大写字母,250) 也可以由 执行。完整的信号集、它们的语义和 它们的默认处理是实现定义的;所有信号编号 应该是积极的。

您的类比很糟糕,因为异常不是中断。异常与您的代码同步,而中断不是天生的。

【讨论】:

    【解决方案2】:

    一般来说,不会。在特定情况下,是的。 ISO/IEC 9899 指定的信令是 UNIX 中信号工作方式的精简(为了可移植性)变体。 IEEE 1003.1 (POSIX) 将此扩展为完整的 UNIX 信令 API。但是,它不保证操作系统在内部使用相同的系统。以下是一些示例。

    内部使用 C 信号的系统

    • Linux
    • FreeBSD/NetBSD/OpenBSD
    • 许多其他单元

    内部不使用 C 信号的系统

    • 计划 9 使用 notes,APE(ANSI/POSIX 环境)兼容层将注释转换为 UNIX 信号,用于以标准 C 或针对 POSIX 编写的程序
    • Solaris 对每个进程使用一个信号处理程序。然而,这对程序员来说是不可见的,因为 libc 会根据信号随附的元数据将此单一信号类型转换为传统的 UNIX 信号
    • Windows 和 VMS 使用异步过程调用

    【讨论】:

    • NT 内核提供了仿照 VMS 模式的异步过程调用。这些被翻译成 C 信号。
    【解决方案3】:

    标准 C 库的包含文件中指定的每个信号都是操作系统信号(例如在 Linux 中)。反之则不然,即可能存在标准 C 库不知道的操作系统信号。

    在我的系统上,SIGABRT 有 3 个定义(都一样):

    /usr/include/x86_64-linux-gnu/asm/signal.h:#define SIGABRT       6
    /usr/include/x86_64-linux-gnu/bits/signum.h:#define SIGABRT     6   /* Abort (ANSI).  */
    /usr/include/asm-generic/signal.h:#define SIGABRT        6
    

    请注意,操作系统和 C 库对同一信号使用不同的值是合法的(但不寻常)。

    【讨论】:

      【解决方案4】:

      是的。

      您可以在您的进程中从您的操作系统中捕获这些信号,或者从您的进程中触发它们以与操作系统或其他进程进行交互。

      看看this example

      【讨论】:

      • 没有。例如,在计划 9 中它们不是。
      • 是的,但问题中列出的信号是。
      • 不在计划 9 上。而且 ISO 9899 并不要求系统实际生成 ISO C 信号。
      猜你喜欢
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-19
      • 2020-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多