来自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()是一个系统调用函数还是非系统调用函数?
发布于 2018-05-31 05:01:36
syscalls的手册表明包装间接是常见的,并且有一个包含signal(2)的Linux syscalls列表。
发布于 2018-05-31 05:10:45
在Linux上有一个signal系统调用(请参阅吉姆给出的Linux系统调用列表)。您从不直接捕获系统调用,总是调用包装函数(至少很少直接生成陷阱)。正如手册中所述,signal()只是一个可能不是signal调用的系统调用的包装器(在@Jim引用的文档中给出了truncate的示例)。signal()函数位于libc中,如果语义保持不变,库可以自由地以它想要的方式实现该函数。因此,正如您所提到的,在给定的情况下,对signal()的调用可能会诱捕到signal系统调用或sigaction系统调用或任何适当的调用。
https://stackoverflow.com/questions/50616899
复制相似问题