signal ()- 处理中断信号
格式
#include <signal.h>
void ( *signal (int sig, void(*func)(int)) )(int);语言级别
ANSI
线程安全
是
描述
signal() 函数允许程序选择多种方法之一来处理来自操作系统或来自 raise() 函数的中断信号。 如果使用 SYSIFCOPT (*ASYNCSIGNAL) 选项进行编译,那么此函数将使用异步信号。 此函数的异步版本的行为类似于具有 SA_NODEFER 和 SA_RESETHAND 选项的 sigaction() 。 异步信号处理程序不能调用 abort() 或 exit()。 此函数描述的其余部分将描述同步信号。
锡格 自变量必须是在 signal.h 包含文件中定义的宏 SIGABRT, 所有, SIGILL, SIGINT, SIGFPE, SIGIO, 西其他, SIGSEGV, 西格术语, SIGUSR1或 SIGUSR2之一。 SIGALL, SIGIO和 SIGOTHER 仅受 ILE C/C++ 运行时库支持。 丰克 自变量必须是 <signal.h> include 文件中定义的其中一个宏 SIG_DFL 或 SIG_IGN或函数地址。
sig 的值的含义如下所示:
- 值
- 含义
- SIGABRT
- 异常终止 (abnormal termination)
- SIGALL
- Catch-all 表示当前处理操作为 SIG_DFL 的信号。
当指定 SYSIFCOPT (*ASYNCSIGNAL) 时, SIGALL 不是全捕获信号。 仅对用户生成的 SIGALL 信号调用 SIGALL 的信号处理程序。
- SIGILL
- 检测到无效的函数图像
- SIGFPE
- 未屏蔽的算术异常,例如溢出,除零和无效操作
- SIGINT
- 交互式关注
- SIGIO
- 记录文件 I/O 错误
- SIGOTHER
- ILE C 信号
- SIGSEGV
- 对无效内存的访问权
- SIGTERM
- 发送到程序的结束请求
- SIGUSR1
- 供用户应用程序使用。 (扩展至 ANSI)
- SIGUSR2
- 供用户应用程序使用。 (扩展至 ANSI)
接收中断信号时执行的操作取决于 func的值。
- 值
- 含义
- SIG_DFL
- 将对信号进行缺省处理。
- SIG_IGN
- 该信号将被忽略。
返回值
返回值 SIG_ERR 指示调用 signal()时发生错误。 如果成功,那么对 signal() 的调用将返回 func的最新值。 errno 的值可以设置为 EINVAL (信号无效)。
示例
此示例显示如何建立信号处理程序。
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#define ONE_K 1024
#define OUT_OF_STORAGE (SIGUSR1)
/* The SIGNAL macro does a signal() checking the return code */
#define SIGNAL(SIG, StrCln) { \
if (signal((SIG), (StrCln)) == SIG_ERR) { \
perror("Could not signal user signal"); \
abort(); \
} \
}
void StrCln(int);
void DoWork(char **, int);
int main(int argc, char *argv[]) {
int size;
char *buffer;
SIGNAL(OUT_OF_STORAGE, StrCln);
if (argc != 2) {
printf("Syntax: %s size \n", argv[0]);
return(-1);
}
size = atoi(argv[1]);
DoWork(&buffer, size);
return(0);
}
void StrCln(int SIG_TYPE) {
printf("Failed trying to malloc storage\n");
SIGNAL(SIG_TYPE, SIG_DFL);
exit(0);
}
void DoWork(char **buffer, int size) {
int rc;
*buffer = malloc(size*ONE_K); /* get the size in number of K */
if (*buffer == NULL) {
if (raise(OUT_OF_STORAGE)) {
perror("Could not raise user signal");
abort();
}
}
return;
}
/* This is a program fragment and not a complete function example */
相关信息
- abort ()-停止程序
- atexit ()-记录程序结束功能
- exit ()-结束程序
- 上调 ()-发送信号
- <signal.h>
- "信息中心" 中的 API 主题中的 signal () API。