首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >‘`signal()’是Linux上的系统调用函数吗?

问‘`signal()’是Linux上的系统调用函数吗?
EN

Stack Overflow用户
提问于 2018-05-31 04:57:19
回答 2查看 1.7K关注 0票数 2

来自signal() http://man7.org/linux/man-pages/man2/signal.2.html的手册

名顶 信号- ANSI C信号处理 概要顶部 #包括 typedef void (*sighandler_t)(int);sighandler_t信号(int signum,sighandler_t处理程序); Linux上的情况如下: *内核的signal()系统调用提供了system语义。*默认情况下,在glibc 2和更高版本中,signal()包装函数不调用内核系统调用。相反,它使用提供BSD语义的标志调用sigaction(2)。只要定义了合适的特性测试宏,就会提供这种默认行为:在glibc 2.19和更早版本上定义_BSD_SOURCE,在glibc 2.19及更高版本中定义_DEFAULT_SOURCE。(默认情况下,定义了这些宏;有关详细信息,请参见feature_test_macros(7)。)如果没有定义这样的特性测试宏,那么signal()将提供System语义。

在我看来,signal()不是一个系统调用,而是一个基于系统调用sigaction()实现的包装函数,除了“内核的信号()系统调用”之外。

那么,在Linux上,signal()是一个系统调用函数还是非系统调用函数?

EN

回答 2

Stack Overflow用户

发布于 2018-05-31 05:01:36

syscalls的手册表明包装间接是常见的,并且有一个包含signal(2)的Linux syscalls列表。

http://man7.org/linux/man-pages/man2/syscalls.2.html

票数 4
EN

Stack Overflow用户

发布于 2018-05-31 05:10:45

在Linux上有一个signal系统调用(请参阅吉姆给出的Linux系统调用列表)。您从不直接捕获系统调用,总是调用包装函数(至少很少直接生成陷阱)。正如手册中所述,signal()只是一个可能不是signal调用的系统调用的包装器(在@Jim引用的文档中给出了truncate的示例)。signal()函数位于libc中,如果语义保持不变,库可以自由地以它想要的方式实现该函数。因此,正如您所提到的,在给定的情况下,对signal()的调用可能会诱捕到signal系统调用或sigaction系统调用或任何适当的调用。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50616899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档