Ya, ini adalah aplikasi Qt, tapi saya menjalankannya dari konsol selama pengembangan. (Ini Linux)
Scott
Jawaban:
172
signalbukan cara yang paling dapat diandalkan karena berbeda dalam implementasi. Saya akan merekomendasikan menggunakan sigaction. Kode Tom sekarang akan terlihat seperti ini:
Ya, itu POSIX. Saya lupa menambahkan Linux ke pertanyaan.
Scott
2
signal () berperilaku berbeda, tergantung apakah itu mengikuti gaya BSD atau SysV. sigaction () lebih disukai.
asveikau
2
Saya tahu ini sudah tua, tetapi ini tidak dapat dikompilasi di g ++ (Ubuntu 7.4.0-1ubuntu1 ~ 18.04.1) 7.4.0. Saya harus pindah void my_handler(sig_t s)ke void my_handler(sig_atomic_t s).
jcmonteiro
1
Ya, ini adalah pertanyaan yang bergantung pada platform.
Jika Anda menulis program konsol pada POSIX, gunakan API sinyal ( #include <signal.h>).
Dalam aplikasi GUI WIN32 Anda harus menangani WM_KEYDOWNpesan.
Jawaban:
signal
bukan cara yang paling dapat diandalkan karena berbeda dalam implementasi. Saya akan merekomendasikan menggunakansigaction
. Kode Tom sekarang akan terlihat seperti ini:sumber
int s
argumen.sig_t
itu sendiri merupakan tipe pointer fungsi.printf()
tidak async-signal-safe, jadi tidak dapat digunakan di dalam handler sinyal.sa_mask
dansa_flags
.Untuk aplikasi konsol Windows, Anda ingin menggunakan SetConsoleCtrlHandler untuk menangani CTRL+ Cdan CTRL+BREAK .
Lihat di sini untuk contoh.
sumber
Anda harus menangkap sinyal SIGINT (kita berbicara POSIX kan?)
Lihat jawaban @Gab Royer untuk sigaction.
Contoh:
sumber
void my_handler(sig_t s)
kevoid my_handler(sig_atomic_t s)
.Ya, ini adalah pertanyaan yang bergantung pada platform.
Jika Anda menulis program konsol pada POSIX, gunakan API sinyal (
#include <signal.h>
).Dalam aplikasi GUI WIN32 Anda harus menangani
WM_KEYDOWN
pesan.sumber