Pemprosesan isyarat C++
Isyarat ialah gangguan yang dihantar kepada proses oleh sistem pengendalian, yang akan menamatkan program lebih awal. Pada sistem UNIX, LINUX, Mac OS X atau Windows, anda boleh menjana gangguan dengan menekan Ctrl+C.
Sesetengah isyarat tidak dapat ditangkap oleh program, tetapi isyarat yang disenaraikan dalam jadual berikut boleh ditangkap oleh program dan tindakan yang sesuai boleh diambil berdasarkan isyarat. Isyarat ini ditakrifkan dalam fail pengepala C++ <csignal>.
信号 | 描述 |
---|---|
SIGABRT | 程序的异常终止,如调用 abort。 |
SIGFPE | 错误的算术运算,比如除以零或导致溢出的操作。 |
SIGILL | 检测非法指令。 |
SIGINT | 接收到交互注意信号。 |
SIGSEGV | 非法访问内存。 |
SIGTERM | 发送到程序的终止请求。 |
fungsi isyarat()
Pustaka pemprosesan isyarat C++ menyediakan fungsi isyarat untuk menangkap peristiwa yang tidak dijangka. Berikut ialah sintaks fungsi signal():
void (*signal (int sig, void (*func)(int)))(int);
Fungsi ini menerima dua parameter: parameter pertama ialah integer, mewakili nombor isyarat, parameter kedua ialah penunjuk kepada fungsi pemprosesan isyarat .
Mari kita menulis program C++ yang mudah untuk menangkap isyarat SIGINT menggunakan fungsi signal(). Tidak kira apa isyarat yang anda ingin tangkap dalam program anda, anda mesti menggunakan fungsi isyarat untuk mendaftarkan isyarat dan mengaitkannya dengan pengendali isyarat. Lihat contoh berikut:
#include <iostream> #include <csignal> using namespace std; void signalHandler( int signum ) { cout << "Interrupt signal (" << signum << ") received.\n"; // 清理并关闭 // 终止程序 exit(signum); } int main () { // 注册信号 SIGINT 和信号处理程序 signal(SIGINT, signalHandler); while(1){ cout << "Going to sleep...." << endl; sleep(1); } return 0; }
Apabila kod di atas disusun dan dilaksanakan, ia menghasilkan hasil berikut:
Going to sleep.... Going to sleep.... Going to sleep....
Sekarang, tekan Ctrl+C untuk mengganggu program dan anda akan lihat Program menangkap isyarat dan atur cara mencetak yang berikut dan keluar:
Going to sleep.... Going to sleep.... Going to sleep.... Interrupt signal (2) received.
fungsi raise()
Anda boleh menjana isyarat menggunakan fungsi raise() yang mengambil integer Nombor isyarat digunakan sebagai parameter, dan sintaksnya adalah seperti berikut:
int raise (signal sig);
Di sini, sig ialah nombor isyarat yang akan dihantar Isyarat ini termasuk: TANDA , SIGABRT, SIGFPE, SIGILL, SIGSEGV, SIGTERM, SIGHUP . Berikut ialah contoh di mana kita menggunakan fungsi raise() untuk menjana isyarat secara dalaman:
#include <iostream> #include <csignal> using namespace std; void signalHandler( int signum ) { cout << "Interrupt signal (" << signum << ") received.\n"; // 清理并关闭 // 终止程序 exit(signum); } int main () { int i = 0; // 注册信号 SIGINT 和信号处理程序 signal(SIGINT, signalHandler); while(++i){ cout << "Going to sleep...." << endl; if( i == 3 ){ raise( SIGINT); } sleep(1); } return 0; }
Apabila kod di atas disusun dan dilaksanakan, ia akan menghasilkan keputusan berikut dan akan keluar secara automatik:
Going to sleep.... Going to sleep.... Going to sleep.... Interrupt signal (2) received.