Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
UNIX中的信号处理_Unix_Signals - Fatal编程技术网

UNIX中的信号处理

UNIX中的信号处理,unix,signals,Unix,Signals,注册后处理一个信号。在信号处理器函数中,是否需要再次调用signal()以重新注册?检查答案。或者特别是链接。 基本上,它取决于unix系统遵循的模型(BSD或SystemV) 从信号手册页中提取 在原始的Unix系统中,当通过传递信号调用使用signal()建立的处理程序时,信号的处理将被重置 到SIG_DFL,系统不会阻止信号的进一步实例的传递。SystemV还为signal()提供了这些语义。这很糟糕,因为 信号可能会在处理程序有机会重新建立自身之前再次传递。此外,同一信号的快速传递可能导

注册后处理一个信号。在信号处理器函数中,是否需要再次调用signal()以重新注册?

检查答案。或者特别是链接。 基本上,它取决于unix系统遵循的模型(BSD或SystemV)

从信号手册页中提取

在原始的Unix系统中,当通过传递信号调用使用signal()建立的处理程序时,信号的处理将被重置 到SIG_DFL,系统不会阻止信号的进一步实例的传递。SystemV还为signal()提供了这些语义。这很糟糕,因为 信号可能会在处理程序有机会重新建立自身之前再次传递。此外,同一信号的快速传递可能导致递归 处理程序的调用

BSD通过更改信号处理的语义改进了这种情况(但不幸的是,在使用signal()建立处理程序时,无声地更改了语义)。在BSD上,当调用信号处理程序时,不会重置信号配置,并且在 处理程序正在执行

Linux上的情况如下:

  • 内核的signal()系统调用提供SystemV语义
  • 默认情况下,在glibc2及更高版本中,signal()包装函数不调用内核系统调用。相反,它使用提供BSD语义的标志调用sigaction(2)。只要定义了_BSD_SOURCE feature test宏,就会提供此默认行为。默认情况下,定义了_BSD_SOURCE;如果定义了_GNU_SOURCE,它也会隐式定义,当然也可以显式定义。
    在glibc 2和更高版本上,如果未定义_BSD_SOURCE feature test宏,则signal()提供System V语义。(如果在标准模式之一(-std=xxx或-ansi)中调用gcc(1)或定义各种其他特性测试宏,如_POSIX_SOURCE、_XOPEN_SOURCE或_SVID_SOURCE,则不提供_BSD_SOURCE的默认隐式定义;请参阅特性测试宏(7)。)
  • Linux libc4和libc5中的signal()函数提供System V语义。如果libc5系统上有一个包含而不是,则signal()提供BSD语义

是否需要再次调用signal()以重新注册?