Bagikan melalui


signal

Mengatur penanganan sinyal interupsi.

Penting

Jangan gunakan metode ini untuk mematikan aplikasi Microsoft Store, kecuali dalam skenario pengujian atau penelusuran kesalahan. Cara terprogram atau UI untuk menutup aplikasi Store tidak diizinkan sesuai dengan kebijakan Microsoft Store. Untuk informasi selengkapnya, lihat Siklus hidup aplikasi UWP.

Sintaks

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

Parameter

sig
Nilai sinyal.

func
Parameter kedua adalah penunjuk ke fungsi yang akan dijalankan. Parameter pertama adalah nilai sinyal, dan parameter kedua adalah subkode yang dapat digunakan saat parameter pertama adalah SIGFPE.

Nilai hasil

signal mengembalikan nilai func sebelumnya yang terkait dengan sinyal yang diberikan. Misalnya, jika nilai func sebelumnya adalah SIG_IGN, nilai yang dikembalikan juga SIG_IGN. Nilai SIG_ERR pengembalian menunjukkan kesalahan; dalam hal ini, errno diatur ke EINVAL.

Untuk informasi selengkapnya tentang kode pengembalian, lihat errno, , _doserrno_sys_errlist, dan _sys_nerr.

Keterangan

Fungsi ini signal memungkinkan proses untuk memilih salah satu dari beberapa cara untuk menangani sinyal interupsi dari sistem operasi. Argumen sig adalah gangguan yang signal merespons; itu harus menjadi salah satu konstanta manifes berikut, yang didefinisikan dalam SIGNAL.H.

sig nilai Deskripsi
SIGABRT Penghentian abnormal
SIGFPE Kesalahan titik mengambang
SIGILL Instruksi ilegal
SIGINT Sinyal CTRL+C
SIGSEGV Akses penyimpanan ilegal
SIGTERM Permintaan penghentian

Jika sig bukan salah satu nilai di atas, handler parameter yang tidak valid dipanggil, seperti yang didefinisikan dalam Validasi parameter . Jika eksekusi diizinkan untuk melanjutkan, fungsi ini diatur errno ke EINVAL dan mengembalikan SIG_ERR.

Secara default, signal mengakhiri program panggilan dengan kode keluar 3, terlepas dari signilai .

Catatan

SIGINT tidak didukung untuk aplikasi Win32 apa pun. Ketika gangguan CTRL+C terjadi, sistem operasi Win32 menghasilkan utas baru untuk menangani gangguan tersebut secara khusus. Ini dapat menyebabkan aplikasi utas tunggal, seperti satu di UNIX, menjadi multithreaded dan menyebabkan perilaku yang tidak terduga.

Argumen func adalah alamat ke handler sinyal yang Anda tulis, atau ke salah satu konstantaSIG_DFL tindakan sinyal yang telah ditentukan sebelumnya atau SIG_IGN, yang juga didefinisikan dalam SIGNAL.H. Jika func adalah fungsi, itu diinstal sebagai penangan sinyal untuk sinyal yang diberikan. Prototipe handler sinyal memerlukan satu argumen formal, sig, dari jenis int. Sistem operasi menyediakan argumen aktual melalui sig ketika interupsi terjadi; argumen adalah sinyal yang menghasilkan interupsi. Oleh karena itu, Anda dapat menggunakan enam konstanta manifes (tercantum dalam tabel sebelumnya) di handler sinyal Anda untuk menentukan gangguan mana yang terjadi dan mengambil tindakan yang sesuai. Misalnya, Anda dapat memanggil signal dua kali untuk menetapkan handler yang sama ke dua sinyal yang berbeda, lalu menguji sig argumen di handler untuk mengambil tindakan yang berbeda berdasarkan sinyal yang diterima.

Jika Anda menguji pengecualian floating-point (SIGFPE), arahkan ke fungsi yang mengambil argumen kedua opsional yang merupakan salah satu dari beberapa konstanta manifes, yang didefinisikan dalam FLOAT.H, dari formulir FPE_xxxfunc . SIGFPE Ketika sinyal terjadi, Anda dapat menguji nilai argumen kedua untuk menentukan jenis pengecualian floating-point, lalu mengambil tindakan yang sesuai. Argumen ini dan nilai yang mungkin adalah ekstensi Microsoft.

Untuk pengecualian floating-point, nilai func tidak diatur ulang saat sinyal diterima. Untuk memulihkan dari pengecualian floating-point, gunakan klausul try/except untuk mengelilingi operasi floating point. Dimungkinkan juga untuk pulih dengan menggunakan setjmp dengan longjmp. Dalam kedua kasus, proses panggilan melanjutkan eksekusi dan membiarkan status floating-point proses tidak terdefinisi.

Jika handler sinyal kembali, proses panggilan melanjutkan eksekusi segera setelah titik di mana ia menerima sinyal interupsi, terlepas dari jenis sinyal atau mode operasi.

Sebelum fungsi yang ditentukan dijalankan, nilai func diatur ke SIG_DFL. Sinyal interupsi berikutnya diperlakukan seperti yang dijelaskan untuk SIG_DFL, kecuali panggilan intervensi untuk signal menentukan sebaliknya. Anda dapat menggunakan fitur ini untuk mengatur ulang sinyal dalam fungsi yang disebut.

Karena rutinitas penangan sinyal sering disebut secara asinkron ketika gangguan terjadi, fungsi penangan sinyal Anda mungkin mendapatkan kontrol ketika operasi run-time tidak lengkap dan dalam keadaan tidak diketahui. Daftar berikut ini meringkas batasan yang menentukan fungsi mana yang dapat Anda gunakan dalam rutinitas penangan sinyal Anda.

  • Jangan terbitkan rutinitas tingkat rendah atau STDIO.H I/O (misalnya, printf atau fread).

  • Jangan panggil rutinitas tumpukan atau rutinitas apa pun yang menggunakan rutinitas tumpukan (misalnya, malloc, _strdup, atau _putenv). Untuk informasi selengkapnya, lihat malloc .

  • Jangan gunakan fungsi apa pun yang menghasilkan panggilan sistem (misalnya, _getcwd atau time).

  • Jangan gunakan longjmp kecuali interupsi disebabkan oleh pengecualian floating-point (yaitu, sig adalah SIGFPE). Dalam hal ini, pertama-tama masukkan kembali paket floating-point dengan menggunakan panggilan ke _fpreset.

  • Jangan gunakan rutinitas overlay apa pun.

Program harus berisi kode floating-point jika untuk menjebak SIGFPE pengecualian dengan menggunakan fungsi . Jika program Anda tidak memiliki kode floating-point dan memerlukan kode penanganan sinyal pustaka run-time, cukup nyatakan ganda volatil dan inisialisasi ke nol:

volatile double d = 0.0f;

Sinyal SIGILL dan SIGTERM tidak dihasilkan di bawah Windows. Mereka disertakan untuk kompatibilitas ANSI. Oleh karena itu, Anda dapat mengatur penangan sinyal untuk sinyal ini dengan menggunakan signal, dan Anda juga dapat secara eksplisit menghasilkan sinyal ini dengan memanggil raise.

Pengaturan sinyal tidak dipertahankan dalam proses bertelur yang dibuat oleh panggilan ke _exec atau _spawn fungsi. Pengaturan sinyal diatur ulang ke nilai default dalam proses baru.

Persyaratan

Rutin Header yang diperlukan
signal <signal.h>

Untuk informasi kompatibilitas selengkapnya, lihat Kompatibilitas.

Contoh

Contoh berikut menunjukkan cara menggunakan signal untuk menambahkan beberapa perilaku kustom ke SIGABRT sinyal. Untuk informasi selengkapnya tentang membatalkan perilaku, lihat _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();
}

Output tergantung pada versi runtime yang digunakan, apakah aplikasi adalah konsol atau aplikasi Windows, dan pada pengaturan registri Windows. Untuk aplikasi konsol, sesuatu seperti pesan berikut dapat dikirim ke stderr:

Debug Error!

Program: c:\Projects\crt_signal\Debug\crt_signal.exe

R6010

- abort() has been called

Baca juga

Kontrol proses dan lingkungan
abort
_exec, _wexec fungsi
exit, _Exit, _exit
_fpreset
_spawn, _wspawn fungsi