Linux下signal()是否属于系统调用函数?
在Linux下,
signal()到底是不是系统调用函数? 这个问题得分两层来看,结合你贴的手册内容就能搞明白:
名称 顶部
signal - ANSI C 信号处理概要 顶部
#include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);Linux上的情况如下:
* 内核的signal()系统调用提供System V语义。 * 在glibc 2及更高版本中,默认情况下signal()包装函数不会调用内核系统调用,而是调用sigaction(2)并使用提供BSD语义的标志。只要定义了合适的特性测试宏,就会提供此默认行为:glibc 2.19及更早版本中为_BSD_SOURCE,glibc 2.19及更高版本中为_DEFAULT_SOURCE。(默认情况下这些宏是已定义的;详情请参见feature_test_macros(7)。)如果未定义此类特性测试宏,则signal()提供System V语义。
简单来说:
- 内核层面确实存在
signal()系统调用:它是真正的内核入口,提供的是System V风格的信号处理语义。 - 但我们用户态代码里调用的
signal(),绝大多数时候是glibc的包装函数:- 正常情况下(默认的特性测试宏开启状态),这个包装函数不会直接调用内核的
signal()系统调用,而是调用sigaction()系统调用,配置出BSD语义的信号处理行为; - 只有当你手动关闭了对应的特性测试宏时,glibc的
signal()才会直接调用内核的signal()系统调用,提供System V语义。
- 正常情况下(默认的特性测试宏开启状态),这个包装函数不会直接调用内核的
所以结论是:要看你说的是哪个层面的signal()——内核里有这个系统调用,但用户态日常用的signal()基本是基于sigaction()实现的包装接口。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

