signal

Установка обработки сигналов прерываний.

Важное примечаниеВажно

Не используйте этот метод, чтобы завершить приложение Магазина Windows, за исключением тестирования или в сценариях отладки.Способы программного или пользовательского интерфейса закрыть приложение Магазина Windows не включены в соответствии с разделом 3,6 Требования к центра приложение для Windows 8.Дополнительные сведения см. в разделе Жизненный цикл приложения (Магазина приложения Windows.

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

Параметры

  • sig
    Значение сигнала.

  • func
    Выполняемая функция.Первый параметр является значением сигнала, второй - дополнительным кодом, который может быть использован, когда первый параметр - SIGFPE.

Возвращаемое значение

signal возвращает предыдущее значение func, связанное с заданным сигналом.Например, если предыдущее значение func было SIG_IGN, то возвращаемое значение также является SIG_IGN.Возвращаемое значение SIG_ERR отображает ошибку, в соответствии с которой errno устанавливается в EINVAL.

См. раздел _doserrno, errno, _sys_errlist, and _sys_nerr для дополнительных сведений по этим и другим кодам возврата.

Заметки

Функция signal позволяет процессу выбрать один из нескольких способов обработки сигнала прерывания от операционной системы.Аргумент sig это прерывание, к которому отвечает signal ; он должен быть одной из следующих констант манифестов, указанных в SIGNAL.H.

Значение sig

Описание

SIGABRT

Аварийное завершение

SIGFPE

Ошибка в операции с плавающей запятой

SIGILL

Недопустимая инструкция

SIGINT

Сигнал CTRL+C

SIGSEGV

Недопустимый доступ к хранилищу

SIGTERM

Запрос завершения

Если sig не является одним из приведенных выше значений, то вызывается обработчик недопустимого параметра, как определено в Проверка параметров.Если продолжение выполнения разрешено, функция устанавливает errno в EINVAL и возвращает SIG_ERR.

По умолчанию signal завершает вызывающую программу с кодом завершения 3, независимо от значения sig.

ПримечаниеПримечание

SIGINT не поддерживается для любого приложения Win32.Если происходит прерывание CTRL+C, операционные системы Win32 создают новый поток специально для обработки этого прерывания.Это может привести к тому, что однопоточное приложение, как в UNIX, становится многопоточным, что приводит к непредвиденному поведению.

Аргумент func — это адрес написанного обработчика сигнала, или одна из предопределенных констант SIG_DFL или SIG_IGN, указанных в SIGNAL.H.Если func — функция, она установлена как обработчик сигнала для данного сигнала.Прототип обработчика сигнала требует один формальный аргумент, sig типа int.Операционная система предоставляет фактический аргумент через sig, когда происходит прерывание; аргумент это сигнал, вызвавший прерывание.Таким образом можно использовать шесть констант манифеста (перечисленных в приведенной выше таблице) внутри обработчика сигнала чтобы определить, какое прерывание произошло, и предпринять соответствующие действия.Например, можно вызвать signal дважды, чтобы назначить один и тот же обработчик на два различных сигнала, затем проверить аргумент sig внутри обработчика для выполнения различных действий на основании полученного сигнала.

При проверке на исключение с плавающей запятой (SIGFPE) func указывает на функцию, которая принимает необязательный второй аргумент, являющийся одной из нескольких констант манифеста, определенных в файле FLOAT.H формы FPE_xxx.При возникновении сигнала SIGFPE можно проверить значение второго аргумента для того, чтобы определить тип исключения в операции с плавающей запятой, а затем предпринять соответствующее действие.Этот аргумент и его возможные значения являются расширениями Microsoft.

Для исключений в операциях с плавающей запятой значение func не сброшено после получения сигнала.Для восстановления после исключения в операции с плавающей запятой, используйте конструкции try/except, связанные с операциями с плавающей запятой.Кроме того, можно восстановить с помощью setjmp с longjmp.В любом случае, вызывающий процесс продолжает выполнение с неопределенным состоянием регистров с плавающей запятой.

Если обработчик сигнала завершается, вызывающий процесс продолжает выполнение сразу после точки, на которой он получил сигнал прерывания.Это верно независимо от типа сигнала или режима работы.

Прежде чем функция будет выполняться, значение func установлено в SIG_DFL.Следующий сигнал прерывания обрабатывается как описано для SIG_DFL, если промежуточный вызов signal не укажет другое.Эта особенность позволяет сбросить сигналы в вызываемой функции.

Поскольку функции обработчиков сигналов обычно вызываются асинхронно при возникновении прерывания, функция обработчика сигнала может получить управления, когда операция среды выполнения не полностью завершена и находится в неопределенном состоянии.Список ниже приводит ограничения, которые определяют, какие функции могут использоваться в функции обработчика сигнала.

  • Не следует выполнять низкоуровневые функции или функции ввода-вывода STDIO.H (например printf и fread).

  • Не следует вызывать функции кучи или любую функцию, использующую функции кучи (например, malloc, _strdup и _putenv).Дополнительные сведения см. в разделе malloc .

  • Не используйте никакой функцию, которая создает системный вызов (например, _getcwd, time).

  • Не используйте longjmp, если прерывания не вызывается с плавающей запятой исключением (то есть sigSIGFPE).В этом случае вначале следует инициализировать пакет операций с плавающей запятой с вызовом _fpreset.

  • Не следует использовать функции, которые могли быть уже вызваны.

Программа должна содержать код с операциями с плавающей запятой, если она отлавливает исключение SIGFPE с функцией.Если программа не содержит код, использующий операции с плавающей запятой, и требует выполнение кода обработчиков сигналов библиотеки времени выполнения , просто объявите зависимый тип double и инициализируйте его нулем.

volatile double d = 0.0f; 

Сигналы SIGILL и SIGTERM не формируются в Windows.Они включены для режима совместимости ANSI.Таким образом можно задать обработчики сигналов для этих сигналов с помощью signal, а также можно явно создавать эти сигналы путем вызова raise.

Параметры сигнала не сохраняются в процессах, созданных вызовами функций _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