- C 标准库
- C 库 - 首页
- C 库 - <assert.h>
- C 库 - <complex.h>
- C 库 - <ctype.h>
- C 库 - <errno.h>
- C 库 - <fenv.h>
- C 库 - <float.h>
- C 库 - <inttypes.h>
- C 库 - <iso646.h>
- C 库 - <limits.h>
- C 库 - <locale.h>
- C 库 - <math.h>
- C 库 - <setjmp.h>
- C 库 - <signal.h>
- C 库 - <stdalign.h>
- C 库 - <stdarg.h>
- C 库 - <stdbool.h>
- C 库 - <stddef.h>
- C 库 - <stdio.h>
- C 库 - <stdlib.h>
- C 库 - <string.h>
- C 库 - <tgmath.h>
- C 库 - <time.h>
- C 库 - <wctype.h>
- C 标准库资源
- C 库 - 快速指南
- C 库 - 有用资源
- C 库 - 讨论
C 库 - raise() 函数
C 库的 raise(sig) 函数会导致生成信号 sig。sig 参数与 SIG 宏兼容。
两种类型的信号处理:
- 测试信号处理:在这种信号处理中,我们使用 raise() 来检查信号处理程序是否对特定信号正确响应。
- 自定义信号处理:如果用户希望使用 signal() 函数设置自定义信号处理,那么我们可以使用 raise() 函数显式调用处理程序。
语法
以下是 C 库 raise() 函数的语法:
int raise(int sig)
参数
此函数仅接受一个信号参数:
sig - 这是要发送的信号编号。以下是一些重要的标准信号常量:
序号 | 宏 & 信号 |
---|---|
1 |
SIGABRT (信号中止) 由 abort 函数发起的异常终止。 |
2 |
SIGFPE (信号浮点异常) 错误的算术运算,例如零除或导致溢出的运算(不一定与浮点运算相关)。 |
3 |
SIGILL (信号非法指令) 无效的函数映像,例如非法指令。这通常是由于代码损坏或尝试执行数据造成的。 |
4 |
SIGINT (信号中断) 交互式注意信号。通常由应用程序用户生成。 |
5 |
SIGSEGV (信号段错误) 无效的存储器访问 - 当程序尝试读取或写入超出分配给它的内存时。 |
6 |
SIGTERM (信号终止) 发送到程序的终止请求。 |
返回值
如果函数成功,则返回零;否则返回非零值。
示例 1
在此示例中,我们使用 C 库 raise() 函数来演示其用法。
#include <signal.h> #include <stdio.h> void signal_catchfunc(int); int main () { int ret; ret = signal(SIGINT, signal_catchfunc); if( ret == SIG_ERR) { printf("Error: unable to set signal handler.\n"); exit(0); } printf("Going to raise a signal\n"); ret = raise(SIGINT); if( ret !=0 ) { printf("Error: unable to raise SIGINT signal.\n"); exit(0); } printf("Exiting...\n"); return(0); } void signal_catchfunc(int signal) { printf("!! signal caught !!\n"); }
输出
以上代码产生以下结果:
Going to raise a signal !! signal caught !! Exiting...
示例 2
在此示例中,我们使用 signal() 和 raise() 函数说明了信号接收方和发送方。
#include <signal.h> #include <stdio.h> void handler(int sig) { // Signal receiver printf("Signal received : %d\n", sig); } int main() { signal(SIGILL, handler); // Signal sender printf("Signal Sended : %d\n", SIGILL); raise(SIGILL); return 0; }
输出
执行以上代码后,我们将获得以下结果:
Signal Sended : 4 Signal received : 4
广告