signal

设置中断通知处理。

重要

不要使用此方法关闭但在测试的 Windows 应用商店 app,或调试方案。以编程方式或 UI 方法结束 Windows 应用商店 app 不根据第 3.6 部分允许的。windows 8 个 app 身份验证要求有关更多信息,请参见 应用程序在段 (windows 中 apps)

void (__cdecl *signal(
   int sig, 
   void (__cdecl *func ) (int [, int ] ))) 
   (int);

参数

  • sig
    信号值。

  • func
    要执行的函数。 第一个参数是指示值,第二个参数是可以使用的子码,当第一个参数是 SIGFPE 时。

返回值

signal 返回 func 以前的值与特定信号。 例如,因此,如果 func 以前的值是 SIG_IGN,返回值也是 SIG_IGN。 在 errno 设置为 EINVAL情况下,SIG_ERR 的返回值指示错误。

请参见 _doserrno、errno、_sys_errlist 和_sys_nerr 有关这方面的更多信息以及其他,返回代码。

备注

signal 功能允许处理选择多种方式之一来处理中断信号从操作系统。 sig 参数是 signal 响应的中断;它在 SIGNAL.H. 必须是下列清单常数之一,定义。

sig 值

描述

SIGABRT

异常终止

SIGFPE

浮点错误

SIGILL

非法的指令

SIGINT

CTRL+C 信号

SIGSEGV

非法存储区访问

SIGTERM

停止请求

如果 sig 不是其中一个以上值,无效参数调用处理程序,对于 参数验证 定义。 如果执行允许继续,此功能设置 errno 到 EINVAL 并返回 SIG_ERR。

默认情况下,无论 sig,的值 signal 停止调用的程序以退出代码 3。

备注

SIGINT 没有为任何 Win32 应用程序的支持。当 CTRL+C 中断时,中断的 Win32 操作系统专门生成新的线程处理。这在 UNIX 可能导致单线程应用程序 (例如将变为多线程,导致意外行为。

func 参数是地址为您编写或某个预定义的常量 SIG_DFL 或 SIG_IGN,还定义在 SIGNAL.H. 的通知处理程序。 如果 func 是函数,则会安装为特定的信号通知处理程序。 通知处理程序的原型需要一个形参,sig,类型 int。 发生中断时,操作系统将 sig 提供实参;参数是生成中断的信号。 因此可以使用六个清单常数 (列表上表中) 中您的信号处理程序中确定哪个中断并执行适当的操作。 例如,可以调用两次 signal 分配相同的处理程序添加到两个不同的信号,然后测试在处理程序中的 sig 参数是基于信号不同的操作接收。

如果为浮点异常 (SIGFPE) 测试,func 指向采用可选的第二个参数是在窗体 FPE_xxx的 FLOAT.H 定义的多个清单常数之一的函数。 当 SIGFPE 信号时,可以测试第二个参数的值确定浮点异常的类型然后执行适当的操作。 此参数及其可能的值是 Microsoft 扩展。

对于浮点异常,func 的值不会重置在收到信号。 从浮点异常若要还原,请使用筛选和除用浮点运算的子句。 恢复使用 setjmplongjmp也是可能的。 仍,调用进程继续为未定义的处理浮点状态。

如果通知处理程序返回,调用处理在收到信号中断的点后继续执行。 为 true 无论信号或操作方法的类型。

在指定的函数前,func 的值设置为 SIG_DFL。 下中断信号将介绍用于 SIG_DFL,除非,插入对 signal 否则指定。 此功能允许您在被调用函数的重置信号。

由于通知处理程序实例通常是异步调用的,发生中断时,您的通知处理程序函数可获取控件,当运行时操作未完成和置于未知状态时。 下表汇总了确定的限制哪些功能在您的通知处理程序实例来使用。

  • 不要问题低级别或 STDIO.H I/O 实例 (例如 printf 和 fread)。

  • 不要调用堆例程或使用堆例程的实例 (例如 malloc、_strdup和 _putenv)。 请参见 malloc 有关更多信息。

  • 不要使用即生成系统调用的任何功能 (,_getcwd,time)。

  • 不要使用 longjmp,除非该中断由一个浮点异常导致的 (即,sig 是 SIGFPE)。 在这种情况下,首先请重新初始化名为的浮点程序包到 _fpreset。

  • 不要使用任何复盖率实例。

如果它是捕获与函数,的 SIGFPE 异常程序必须包含浮点代码。 如果程序不具有浮点代码并且不需要运行库的信号处理代码,请声明变量二进制文件并将其初始化为零:

volatile double d = 0.0f; 

SIGILL 和 SIGTERM 信号不会在 windows 下。 它们为 ANSI 兼容性包括在内。 因此可以设置这些信号的信号处理程序与 signal,因此,您可以通过调用 引发显式还生成这些信号。

信号将产生未保留处理创建对 _exec 或 _spawn 功能。 信号设置被重置为中的默认值更新过程。

要求

实例

必需的标头

signal

<signal.h>

有关其他的兼容性信息,请参见中介绍的 兼容性

示例

下面的示例演示使用 signal 添加一些自定义行为。SIGABRT 信号。 有关中止行为的更多信息,请参见 _set_abort_behavior

// crt_signal.c
// compile with: /c
// Use signal to attach a signal handler to the abort routine
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <tchar.h>

void SignalHandler(int signal)
{
    printf("Application aborting...\n");
}

int main()
{
    typedef void (*SignalHandlerPointer)(int);

    SignalHandlerPointer previousHandler;
    previousHandler = signal(SIGABRT, SignalHandler);
    
    abort();
}
       

.NET Framework 等效项

不适用。若要调用标准 C 函数,请使用 PInvoke。有关更多信息,请参见 平台调用示例

请参见

参考

处理和环境控件

abort

_exec, _wexec功能

exit, _exit

_fpreset

_spawn, _wspawn功能