C 语言库函数 - signal()
C 语言标准库 <signal.h> 函数 void (signal(int sig, void (func)(int)))(int) 设置一个函数来处理信号,即带有 sig 参数的信号处理程序。
头文件
#include <signal.h>
函数原型
下面是 signal() 函数的原型
void (*signal(int sig, void (*func)(int)))(int)
参数
- sig:在信号处理程序中作为变量使用的信号码
下面是一些重要的标准信号常量
宏 | 信号 |
---|---|
SIGABRT | (Signal Abort) 程序异常终止 |
SIGFPE | (Signal Floating-Point Exception) 算术运算出错,如除数为 0 或溢出(不一定是浮点运算) |
SIGILL | (Signal Illegal Instruction) 非法函数映象,如非法指令,通常是由于代码中的某个变体或者尝试执行数据导致的 |
SIGINT | (Signal Interrupt) 中断信号,如 ctrl-C,通常由用户生成 |
SIGSEGV | (Signal Segmentation Violation) 非法访问存储器,如访问不存在的内存单元。 |
SIGTERM | (Signal Terminate) 发送给本程序的终止请求信号 |
- func: 一个指向函数的指针。 它可以是一个由程序定义的函数,也可以是下面预定义函数之一:
函数 | 说明 |
---|---|
SIG_DFL | 默认的信号处理程序 |
--- | --- |
SIG_IGN | 忽视信号 |
返回值
该函数返回信号处理程序之前的值,当发生错误时返回 SIG_ERR
范例
下面的范例演示了 signal() 函数的用法
/** * file: main.c * author: 简单教程(www.twle.cn) * * Copyright © 2015-2065 www.twle.cn. All rights reserved. */ #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <signal.h> void sighandler(int); int main() { signal(SIGINT, sighandler); while(1) { printf("wait 1s...\n"); sleep(1); } return(0); } void sighandler(int signum) { printf("捕获信号 %d,跳出...\n", signum); exit(1); }
编译运行以上范例,输出如果如下
运行时程序会进入无限循环,需使用组合键 CTRL + C
键跳出程序
$ gcc main.c && ./a.out wait 1s... wait 1s... wait 1s... wait 1s... wait 1s... wait 1s... wait 1s... wait 1s... wait 1s... wait 1s... ^C捕获信号 2,跳出...