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_IGNolur. 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_errlistve _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.Htanı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 signe 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_IGNbirine yönelik bir adrestir. bir işlevse func , verilen sinyal için sinyal işleyicisi olarak yüklenir. Sinyal işleyicisinin prototipi, sigtüründe intbir 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_xxxtanı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 longjmpkullanarak 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_DFLayarlanır. Sonraki kesme sinyali, aksini belirten bir araya gelen bir çağrı signal olmadığı sürece için SIG_DFLaçı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 veya fread) verme.

  • Yığın yordamlarını veya yığın yordamlarını kullanan herhangi bir yordamı çağırmayın (örneğin, malloc, _strdupveya _putenv). Daha fazla bilgi için bkz. malloc.

  • Sistem çağrısı oluşturan herhangi bir işlev kullanmayın (örneğin, _getcwd veya time).

  • 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ı _fpresetkullanarak 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 signalbu sinyaller için sinyal işleyicileri ayarlayabilir ve ayrıca çağırarak raisebu 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