Aracılığıyla paylaş


sinyal

Kesme sinyal işlemeyi ayarlar.

Önemli notÖnemli

Test veya hata ayıklama senaryoları dışında, bir Windows Mağazası uygulamasını kapatmak için bu yöntemi kullanmayın.Windows 8 uygulama sertifika gereksinimlerindeki Bölüm 3.6'ya göre, Windows Mağazası uygulamasını kapatmak için programlama veya UI yollarına izin verilmez.Daha fazla bilgi için bkz: Uygulama yaşam döngüsü (Windows Mağazası uygulamaları).

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

Parametreler

  • sig
    Sinyal değeri.

  • func
    Yürütülecek işlev.İlk parametre bir sinyal değeridir ve ikinci parametre ise ilk parametre SIGFPE olduğunda kullanılabilen bir alt koddur.

Dönüş Değeri

signal, func 'ın verili sinyal ile ilişkili önceki değerini döndürür.Örneğin, önceki func değeri SIG_IGN ise, dönüş değeri de SIG_IGN değeridir.SIG_ERR öğesinin dönüş değeri bir hatayı gösterir; bu durumda, errnoEINVAL öğesine ayarlanır.

Dönüş kodları hakkında daha fazla bilgi için bkz. errno, _doserrno, _sys_errlist, and _sys_nerr

Notlar

signal işlevi bir işlemin işletim sisteminden gelen bir kesme sinyalini işlemek üzere biden çok yol seçebilmesini sağlar.sig bağımsız değişkeni signal'e yanıt veren kesintidir; SIGNAL.H'de tanımlanan aşağıdaki bildirimlerinden biri olmak zorundadır.

sig değeri

Tanımlama

SIGABRT

Olağan dışı sonlandırma

SIGFPE

Kayan nokta hatası

SIGILL

Geçersiz yönerge

SIGINT

CTRL+C sinyali

SIGSEGV

Geçersiz depo erişimi

SIGTERM

Sonlandırma isteği

sig yukarıdaki değerlerden biri değilse, geçersiz parametre işleyicisi Parametre Doğrulama konusunda tanımlanan şekilde çağrılır.Yürütmenin devam etmesine izin verilirse, bu işlev errno öğesini EINVAL olarak ayarlar ve SIG_ERR döndürür.

Varsayılan olarak, signal, sig değeri ne olursa olsunda çıkış kodu 3 ile arama programını sonlandıracaktır.

[!NOT]

SIGINT herhangi bir Win32 uygulaması için desteklenmez.CTRL + C kesme oluştuğunda, Win32 işletim sistemleri, özellikle bu kesmeyi işlemek için yeni bir iş parçacığı oluşturur.Bu, UNIX'deki gibi bir tek iş parçacıklı uygulamanın çok iş parçacıklı hale gelmesine ve beklenmeyen davranışlara yol açabilir.

func bağımsız değişkeni yazdığınız bir sinyal işleyicisine veya ayrıca SIGNAL.H içerisinde tanımlanan SIG_DFL veya SIG_IGN ön tanımlı sabitlerden birine yönlendirilen bir adrestir.func bir işlev ise, verilen sinyal için sinyal işleyicisi olarak yüklenir.Sinyal işleyicinin prototipi int türünde bir biçimsel sig bağımsız değişkeni gerektirir.Bir kesme oluştuğunda işletim sistemi sig üzerinden asıl bağımsız değişkenini sağlar, bağımsız değişken kesmeyi oluşturan sinyaldir.Bu nedenle, hangi kesintinin oluştuğunu belirlemek için, sinyal işleyicinizdeki altı bildirim sabitini (yukarıdaki tabloda listelenen) kullanabilirsiniz ve uygun eylemde bulunabilirsinizÖrneğin, iki farklı sinyale aynı işleyiciyi atamak için signal işlevini iki kez çağırabilir ve ardından alınan sinyale göre farklı eylemlerde bulunmak üzere işleyicideki sig bağımsız değişkenini test edebilirsiniz.

Kayan nokta özel durumları (SIGFPE) için sınıyorsanız, funcFPE_xxx biçiminde FLOAT.H olarak tanımlanmış birçok bildirim sabitinden ikince bağımsız değişkeni alan işlevi belirtir.Bir SIGFPE sinyali oluştuğunda, kayan nokta özel durumu türünü belirlemek üzere ikinci bağımsız değişkenin değerini teste 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, func değeri, sinyal alındığında sıfırlanmaz.Kayan nokta özel durumlarından kurtulmak için, kayan nokta işlemlerinin etrafında dene/hariç yan tümcelerini kullanın.setjmp ile longjmp birlikte kullanılarak da kurtarılabilir.Her iki durumda da, arama işlemi yürütmeye devam eder ve kayan nokta işleminin durumunu tanımsız bırakır.

Sinyal tutucusu dönerse, arama işlemi yürütmeyi, kesme sinyallerini aldığı noktanın hemen ardından devam ettirir.Bu, sinyal türü veya işletim modu ne olursa olsun doğrudur.

Belirtilen işlev yürütülmeden önce, func değeri SIG_DFL olarak ayarlanır.signal'a yönelik bir bölen çağrı tersini belirtmediği sürece bir sonraki kesme sinyali SIG_DFL için belirtildiği şekilde değerlendirilecektir.Bu özelliği, çağrılan işlevdeki sinyalleri sıfırlamak için kullanabilirsiniz.

Bir kesilme oluştuğu zaman sinyal işleyicisi rutinleri genellikle uyumsuz olarak adlandırıldığı için, sinyal işleyici işleviniz, bir çalıştırma zaman işlemi tamamlanmadığında ve bilinmeyen bir durumda olduğunda denetimi alabilir.Aşağıdaki liste sinyal işleme yordamınızda hangi işlevleri kullanabileceğinizi belirleyen sınırlamaları özetlemektedir.

  • Düşük düzeyli veya STDIO.H G/Ç rutinleri yayınlamayın (örneğin, printf veya fread ).

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

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

  • Kayan nokta özel durumu kesintiye neden olmazsa longjmpöğesini kullanmayın (yani sig, SIGFPE öğesidir).Bu durumda, önce _fpreset çağrısını kullanarak kayan nokta paketini yeniden başlatın.

  • Yer paylaşımı yordamlarını kullanmayın.

İşlevi kullanarak SIGFPE özel durumunu yakalayacaksa, programın kayan nokta kodu içermesi gerekir.Programınızda kayan nokta kodu yoksa ve çalışma zamanı kitaplığının sinyal işleme kodu gerekiyorsa, geçici bir çift bildirip sıfıra eşitlemeniz yeterlidir:

volatile double d = 0.0f; 

SIGILL ve SIGTERM sinyalleri Windows altında oluşturulmaz.ANSI uyumluluğu için eklenmişlerdir.Bu nedenle, bu sinyaller için, signal kullanarak sinyal işleyiciler koyabilirsiniz ve ayrıca, yükselt çağırarak bu sinyalleri açık bir şekilde oluşturabilirsiniz.

Sinyal ayarları, _exec veya _spawn işlevlerine yapılan çağrıların ürettiği işlemlerde korunmaz.Sinyal ayarları yeni süreç içerisinde varsayılan değerlerine geri döndürülür.

Gereksinimler

Yordam

Gerekli başlık

signal

<signal.h>

Ek uyumluluk bilgileri için bkz. Uyumluluk.

Örnek

Aşağıdaki örnek SIGABRT sinyaline bazı özel davranışların eklenmesi için signal'ın nasıl kullanıldığını göstermektedir.Durdurma davranışı hakkında ek 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>
#include <tchar.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();
}
  

.NET Framework Eşdeğeri

Uygulanamaz. Standart C işlevini çağırmak için PInvoke kullanın. Daha fazla bilgi için bkz. Platform Çağırma Örnekleri.

Ayrıca bkz.

Başvuru

Süreç ve Ortam Denetimi

durdur

_exec, _wexec İşlevleri

çıkış, _exit

_fpreset

_spawn, _wspawn İşlevleri