signal
函数 <csignal>
void (*signal(int sig, void (*func)(int)))(int);
设置处理信号函数
指定使用sig指定的信号值处理信号的方法。
参数func指定了程序处理信号的三种方式之一:
-
默认处理(SIG_DFL):该信号由该特定信号的默认操作处理。
-
忽略信号(SIG_IGN):该信号被忽略,即使没有意义,代码也会继续执行。
-
函数处理程序:定义一个特定的函数来处理信号。
对于每个支持的信号,SIG_DFL或SIG_IGN被设置为程序启动时的默认信号处理行为。
☲ 参数
sig
被设置处理函数的信号值。下面的宏常量表达式可以识别标准信号值:
宏 |
信号 |
SIGABRT |
(信号中止)异常终止,比如由中止(abort)函数发起。 |
SIGFPE |
(浮点异常信号)错误的算术运算,例如除零或导致溢出的运算(不一定是浮点运算)。 |
SIGILL |
(非法指令信号)无效的函数镜像,如非法指令。这通常是由于代码损坏或试图执行数据。 |
SIGINT |
(信号中断)交互注意信号。通常由应用程序用户生成。 |
SIGSEGV |
(段错误信号)对存储的无效访问:当一个程序试图在它已经分配的内存之外读取或写入。 |
SIGTERM |
(信号终止)发送到程序的终止请求。 |
每个库实现都可能提供附加的信号值宏常量,可用于此函数。
请注意,并非所有运行环境都生成自动信号,
即使在上面描述的特定情况下也不需要,尽管所有运行环境都必须提供由显式调用
raise函数生成的信号。
func
指向函数的指针。这可以是程序员定义的函数,也可以是以下预定义函数之一:
-SIG_DFL: 默认处理:该信号由该特定信号的默认操作处理。
-SIG_IGN: 忽略信号:信号被忽略。
如果是一个函数,它应该遵循以下原型(带有C链接):
void handler_function (int parameter);
☉ 返回值
返回类型与形参func的类型相同。
如果请求成功,函数返回一个指向特定处理函数的指针,该处理函数在调用之前负责处理这个信号
(如果有的话)。或者是SIG_DFL或SIG_IGN--如果在调用之前,使用默认处理程序或忽略信号。
如果函数没有成功注册新的信号处理过程,它将返回SIG_ERR,
errno可能被设置为正值。
☣ 示例
/* signal example */
#include <stdio.h> /* printf */
#include <signal.h> /* signal, raise, sig_atomic_t */
sig_atomic_t signaled = 0;
void my_handler (int param)
{
signaled = 1;
}
int main ()
{
void (*prev_handler)(int);
prev_handler = signal (SIGINT, my_handler);
/* ... */
raise(SIGINT);
/* ... */
printf ("signaled is %d.\n",signaled);
return 0;
}
|
输出:
signaled is 1.
↭ 数据竞争
Undefined:在多线程程序中调用此函数将导致未定义的行为。
➤ 异常(C++)
无抛出保证:此函数从不抛出异常。
🍄 另请参阅