在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 ++低。
答案 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。但是,它不保证操作系统在内部使用相同的系统。以下是一些例子。
答案 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)