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所有SIGILLSIGINTSIGFPESIGIO西其他SIGSEGV西格术语SIGUSR1SIGUSR2之一。 SIGALLSIGIOSIGOTHER 仅受 ILE C/C++ 运行时库支持。 丰克 自变量必须是 <signal.h> include 文件中定义的其中一个宏 SIG_DFLSIG_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  */

相关信息