操作系统中C标准库<signal.h>中的信号是否发出信号?

时间:2015-12-07 16:20:28

标签: c operating-system signals

在C标准库的<signal.h>中,有效信号包括

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)?我的意思是操作系统使用OS中实现的信号来通知进程,这些进程独立于C标准库,并且位于C编程语言和C标准库的较低级别。

为了让我的问题更清楚(尽我所能),让我来画一个类比。 C ++中的异常及其处理与OS中的中断及其处理不同。后者在OS中实现,独立于C ++编程语言,并且比C ++低。

4 个答案:

答案 0 :(得分:3)

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

C标准7.14 4 /

  

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

你的比喻很糟糕,因为异常不是中断。例外与您的代码同步,而中断本质上不是。

答案 1 :(得分:2)

一般来说,没有。在具体情况下,是的。 ISO / IEC 9899规定的信令是信号在UNIX中工作方式的精简(便携性)变体。 IEEE 1003.1(POSIX)将其扩展为完整的UNIX信令API。但是,它不保证操作系统在内部使用相同的系统。以下是一些例子。

有意使用C信号的系统

  • 的Linux
  • 的FreeBSD / NetBSD的/ OpenBSD的
  • 许多其他unices

内部不使用C信号的系统

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

答案 2 :(得分:1)

标准C库的包含文件中指定的每个信号都是操作系统信号(例如在Linux中)。相反的情况并非如此,即可能存在标准C库未知的OS信号。

在我的系统上,/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 有3个定义(都是相同的):

CREATE TABLE #M(ST VARCHAR(250));
INSERT INTO #M
values
    ('please help me world  (produced... but needs to go)'),
    ('please help me world Y (produced_this is extra extra extra long)'),
    ('please help me world Z (producedthis isshort)'),
    ('please help me world K (produced');

SELECT * 
FROM   #M;

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

答案 3 :(得分:0)

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

查看this example