signal
設定中斷信號處理。
重要
不要使用這個方法會關閉執行 Windows 市集 應用程式,但測試或偵錯案例。以程式設計方式或 UI 模式結束 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 和 _sys_nerr (_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 參數是您寫入的訊號處理常式的位置,或者是同樣定義於 SIGNAL.H 的預定義常數 SIG_DFL 或 SIG_IGN 。 如果 func 是一個函式,它會被設置為給定訊號的訊號處理常式。 訊號處理常式的函式原型須要一個形式引數,是為 int 型別的 sig 。 作業系統在中斷發生時透過 sig 提供實際引數。引數是產生中斷的訊號。 如此您可以使用六個表示常值 (如前表所列) 於您的訊號處理常式來決定發生哪一種中斷並採取適當的動作。 例如,您可以呼叫 signal 兩次來指定相同的處理常式予兩個不同訊號,並在處理常式裏利用 sig 參數來判斷收到的訊號以採取不同的動作。
如果您要測試浮點數例外狀況 (SIGFPE) , func 指向一個接受以 FPE_xxx 的形式定義於 FLOAT.H 的數個表示常值之一做為為選擇性的第二參數的函式。 當發生 SIGFPE 訊號,您可以檢查第二參數的值來得知浮點數例外狀況的種類並採取適當的動作。 此參數以及其可能值是微軟的擴充。
對於浮點例外狀況, func 的值在收到訊號時不會被重設。 若要從浮點例外狀況中回復,請使用 try/except 子句包覆於浮點數運算。 也可以透過與 longjmp 一起使用 setjmp 來回復。 在這兩個情況下,呼叫處理程序在保持浮點狀態未定義之下繼續執行。
如果訊號處理常式結束回傳,呼叫處理程序立刻繼續從收到中斷訊號的地方繼續執行。 不論在何種訊號類別或運算模式下均是如此。
在指定的函式開始執行前, func 的值會被設置為 SIG_DFL 。 下一個中斷訊號的處理方式會如 SIG_DFL 中所述,除非 signal 的干擾呼叫另行指定。 這個功能使您可以重設被呼叫函式裏的訊號。
由於訊號處理常式通常被非同步的呼叫,您的訊號處理常式可能在執行階段未完成或在未知的狀態下得到控制權。 下面的清單總結關於您的訊號處理常式裏可以使用的函式的限制。
請勿使用低階或 STDIO.H 輸入輸出常式 (例如 printf 和 fread) 。
請勿呼叫堆積常式或任何使用堆積常式的常式 (例如 malloc 、 _strdup 和 _putenv) 。 如需詳細資訊,請參閱 malloc。
不要使用即產生系統呼叫的函式 (, _getcwd, time)。
不要使用 longjmp ,除非這個中斷由浮點例外狀況造成的 (也就是說, sig 為 SIGFPE)。 在此情況下,請先利用呼叫 _fpreset 重新初始化浮點封包。
請不要使用任何重疊的常式。
應用程式如果被函式的 SIGFPE 例外狀況困住,必定是因為包含了浮點運算的程式碼。 如果您的程式碼沒有浮點運算程式碼並需要執行階段程式庫的訊號處理代碼,請直接宣告一個 volatile double 並初始化為零:
volatile double d = 0.0f;
SIGILL 和 SIGTERM 信號不會在 Windows 系統中產生。 它們是為了 ANSI 相容性而被包含。 因此您可以使用 signal 來為這些訊號設置訊號處理常式,而且您也可以透過呼叫 raise 來顯式地產生這些訊號。
在呼叫 _exec 或 _spawn 函式所建立的處理程序裏將不會保留訊號設定。 在新處理程序中訊號設定會被設定為預設值。
需求
程序 |
必要的標頭檔 |
---|---|
signal |
<signal.h> |
如需其他相容性資訊,請參閱入門介紹中的 相容性 (Compatibility) 。
範例
下列範例顯示如何使用 signal 加入一些自訂行為至 SIGABRT 信號。 如需abort 行為的詳細資訊,請參閱 _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。如需更多的資訊,請參閱 Platform Invoke Examples 。