signal
Kesme sinyali işlemeyi ayarlar.
Önemli
Test veya hata ayıklama senaryoları dışında bir Microsoft Store uygulamasını kapatmak için bu yöntemi kullanmayın. Microsoft Store ilkelerine göre Bir Mağaza uygulamasını kapatmaya yönelik programlı veya kullanıcı arabirimi yöntemlerine izin verilmez. Daha fazla bilgi için bkz . UWP uygulama yaşam döngüsü.
Sözdizimi
void __cdecl *signal(int sig, int (*func)(int, int));
Parametreler
sig
Sinyal değeri.
func
İkinci parametre, yürütülecek işlevin işaretçisidir. İlk parametre bir sinyal değeri, ikinci parametre ise ilk parametre olduğunda kullanılabilecek bir alt koddur SIGFPE
.
Dönüş değeri
signal
verilen sinyalle ilişkili önceki func değerini döndürür. Örneğin, değerinin önceki değeri func
ise SIG_IGN
, dönüş değeri de SIG_IGN
olur. dönüş değeri SIG_ERR
bir hatayı gösterir; bu durumda olarak errno
ayarlanır EINVAL
.
İade kodları hakkında daha fazla bilgi için bkz. errno
, _doserrno
, _sys_errlist
ve _sys_nerr
.
Açıklamalar
işlevi, signal
bir işlemin işletim sisteminden gelen kesme sinyalini işlemenin çeşitli yollarından birini seçmesini sağlar. sig
Bağımsız değişken, yanıt veren signal
kesmedir; içinde SIGNAL.H
tanımlanan aşağıdaki bildirim sabitlerinden biri olmalıdır.
sig değer |
Açıklama |
---|---|
SIGABRT |
Anormal sonlandırma |
SIGFPE |
Kayan nokta hatası |
SIGILL |
Geçersiz yönerge |
SIGINT |
CTRL+C sinyali |
SIGSEGV |
Geçersiz depolama erişimi |
SIGTERM |
Sonlandırma isteği |
Yukarıdaki değerlerden biri değilsesig
, parametre doğrulama bölümünde tanımlandığı gibi geçersiz parametre işleyicisi çağrılır. Yürütmenin devam etmesi için izin verilirse, bu işlev olarak EINVAL
ayarlanır errno
ve döndürürSIG_ERR
.
Varsayılan olarak, signal
değeri sig
ne olursa olsun çağrı programını çıkış kodu 3 ile sonlandırır.
Not
SIGINT
herhangi bir Win32 uygulaması için desteklenmez. Bir CTRL+C kesmesi oluştuğunda, Win32 işletim sistemleri bu kesmeyi özellikle işlemek için yeni bir iş parçacığı oluşturur. Bu, UNIX'teki bir uygulama gibi tek iş parçacıklı bir uygulamanın çok iş parçacıklı olmasına ve beklenmeyen davranışlara neden olmasına neden olabilir.
func
bağımsız değişkeni, yazdığınız bir sinyal işleyicisinin adresi veya signal.H içinde de tanımlanan önceden tanımlanmış sinyal eylemi sabitlerinden SIG_DFL
veya SIG_IGN
birine yönelik bir adrestir. bir işlevse func
, verilen sinyal için sinyal işleyicisi olarak yüklenir. Sinyal işleyicisinin prototipi, sig
türünde int
bir resmi bağımsız değişken gerektirir. İşletim sistemi, bir kesme gerçekleştiğinde aracılığıyla sig
gerçek bağımsız değişkeni sağlar; bağımsız değişken, kesmeyi oluşturan sinyaldir. Bu nedenle, sinyal işleyicinizdeki altı bildirim sabitini (önceki tabloda listelenmiştir) kullanarak hangi kesmenin oluştuğuna karar verebilir ve uygun eylemi gerçekleştirebilirsiniz. Örneğin, aynı işleyiciyi iki farklı sinyale atamak için iki kez çağırabilir signal
ve ardından alınan sinyale göre farklı eylemler yapmak için işleyicideki bağımsız değişkeni test sig
edebilirsiniz.
Kayan nokta özel durumlarıSIGFPE
( için test ediyorsanız), func
biçiminde FPE_xxx
tanımlanan FLOAT.H
çeşitli bildirim sabitlerinden biri olan isteğe bağlı ikinci bir bağımsız değişken alan bir işleve işaret eder. Bir SIGFPE
sinyal oluştuğunda, kayan nokta özel durumunun türünü belirlemek için ikinci bağımsız değişkenin değerini test edebilir ve ardından uygun eylemi gerçekleştirebilirsiniz. Bu bağımsız değişken ve olası değerleri Microsoft uzantılarıdır.
Kayan nokta özel durumları için değeri func
sinyal alındığında sıfırlanır. Kayan nokta özel durumlarından kurtarmak için, kayan nokta işlemlerini çevrelemek için try/except yan tümcelerini kullanın. ile longjmp
kullanarak setjmp
kurtarmak da mümkündür. Her iki durumda da, çağırma işlemi yürütmeyi sürdürür ve işlemin kayan nokta durumunu tanımsız bırakır.
Sinyal işleyicisi döndürülürse, çağrı işlemi sinyal veya işletim modu türünden bağımsız olarak kesme sinyalini aldığı noktadan hemen sonra yürütmeyi sürdürür.
Belirtilen işlev yürütülmeden önce değeri func
olarak SIG_DFL
ayarlanır. Sonraki kesme sinyali, aksini belirten bir araya gelen bir çağrı signal
olmadığı sürece için SIG_DFL
açıklandığı gibi ele alınır. Çağrılan işlevdeki sinyalleri sıfırlamak için bu özelliği kullanabilirsiniz.
Kesinti oluştuğunda sinyal işleyici yordamları genellikle zaman uyumsuz olarak çağrıldığından, sinyal işleyicisi işleviniz bir çalışma zamanı işlemi eksik ve bilinmeyen bir durumda olduğunda denetimi alabilir. Aşağıdaki liste, sinyal işleyicisi yordamınızda hangi işlevleri kullanabileceğinizi belirleyen kısıtlamaları özetler.
Alt düzey veya
STDIO.H
G/Ç yordamları (örneğin,printf
veyafread
) verme.Yığın yordamlarını veya yığın yordamlarını kullanan herhangi bir yordamı çağırmayın (örneğin,
malloc
,_strdup
veya_putenv
). Daha fazla bilgi için bkz.malloc
.Sistem çağrısı oluşturan herhangi bir işlev kullanmayın (örneğin,
_getcwd
veyatime
).Kesme işlemi kayan nokta özel durumu (yani
sig
SIGFPE
) tarafından yapılmadığı sürece kullanmayınlongjmp
. Bu durumda, ilk olarak çağrısı_fpreset
kullanarak kayan nokta paketini yeniden başlatır.Katman rutini kullanmayın.
bir program, işlevini kullanarak özel durumu yakalamak için kayan SIGFPE
nokta kodu içermelidir. Programınızın kayan nokta kodu yoksa ve çalışma zamanı kitaplığının sinyal işleme kodunu gerektiriyorsa geçici bir çift bildirin ve sıfır olarak başlatın:
volatile double d = 0.0f;
SIGILL
ve SIGTERM
sinyalleri Windows altında oluşturulmaz. Bunlar ANSI uyumluluğuna dahildir. Bu nedenle, kullanarak signal
bu sinyaller için sinyal işleyicileri ayarlayabilir ve ayrıca çağırarak raise
bu sinyalleri açıkça oluşturabilirsiniz.
Sinyal ayarları, veya _spawn
işlevlerine yapılan çağrılar _exec
tarafından oluşturulan oluşturulan işlemlerde korunmaz. Sinyal ayarları yeni işlemdeki varsayılan değerlere sıfırlanır.
Gereksinimler
Yordam | Gerekli başlık |
---|---|
signal |
<signal.h> |
Daha fazla uyumluluk bilgisi için bkz . Uyumluluk.
Örnek
Aşağıdaki örnekte, sinyale bazı özel davranışlar eklemek için nasıl kullanılacağı signal
gösterilmektedir SIGABRT
. Durdurma davranışı hakkında daha fazla bilgi için bkz _set_abort_behavior
. .
// crt_signal.c
// compile with: /EHsc /W4
// Use signal to attach a signal handler to the abort routine
#include <stdlib.h>
#include <signal.h>
void SignalHandler(int signal)
{
if (signal == SIGABRT) {
// abort signal handler code
} else {
// ...
}
}
int main()
{
typedef void (*SignalHandlerPointer)(int);
SignalHandlerPointer previousHandler;
previousHandler = signal(SIGABRT, SignalHandler);
abort();
}
Çıkış, kullanılan çalışma zamanının sürümüne, uygulamanın bir konsol veya Windows uygulaması olmasına ve Windows kayıt defteri ayarlarına bağlıdır. Konsol uygulaması için stderr'a aşağıdaki iletiye benzer bir ileti gönderilebilir:
Debug Error!
Program: c:\Projects\crt_signal\Debug\crt_signal.exe
R6010
- abort() has been called
Ayrıca bkz.
İşlem ve ortam denetimi
abort
_exec
, _wexec
işlevler
exit
, _Exit
, _exit
_fpreset
_spawn
, _wspawn
işlevler