You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:36:37