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 sig
nilai .
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 konstanta SIG_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_xxx
func
. 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
ataufread
).Jangan panggil rutinitas tumpukan atau rutinitas apa pun yang menggunakan rutinitas tumpukan (misalnya,
malloc
,_strdup
, atau_putenv
). Untuk informasi selengkapnya, lihatmalloc
.Jangan gunakan fungsi apa pun yang menghasilkan panggilan sistem (misalnya,
_getcwd
atautime
).Jangan gunakan
longjmp
kecuali interupsi disebabkan oleh pengecualian floating-point (yaitu,sig
adalahSIGFPE
). 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
Lihat juga
Kontrol proses dan lingkungan
abort
_exec
, _wexec
fungsi
exit
, , _Exit
_exit
_fpreset
_spawn
, _wspawn
fungsi