Xử lý tín hiệu (Signal Handling) trong C++
Tín hiệu (Signal) là các ngắt (interrupt) được phân phối tới một tiến trình xử lý bởi hệ điều hành mà có thể kết thúc một chương trình. Bạn có thể tạo các ngắt bằng việc nhấn CTRL+C trên hệ thống UNIX, LINUX, Mac OS hoặc Windows.
Có các signal mà không thể bị bắt bởi chương trình, nhưng cũng có signal mà bạn có thể bắt trong chương trình của bạn, và có thể thực hiện các hành động thích hợp dựa trên signal đó. Những signal này được định nghĩa trong Header file của C++ là <csignal>.
| Signal | Miêu tả |
|---|---|
| SIGABRT | Sự kết thúc bất thường của chương trình, ví dụ một lời gọi tới abort |
| SIGFPE | Một hoạt động số học không đúng, ví dụ như chia cho số 0 hoặc một hoạt động làm tràn luồng (overflow) |
| SIGILL | Sự phát hiện một chỉ lệnh không hợp lệ |
| SIGINT | Nhận một tín hiệu tương tác |
| SIGSEGV | Một truy cập không hợp lệ tới storage |
| SIGTERM | Một yêu cầu kết thúc được gửi tới chương trình |
Hàm signal() trong C++
Thư viện xử lý tín hiệu trong C++ cung cấp hàm signal để bẫy các sự kiện không được mong đợi. Dưới đây là cú pháp của hàm signal() trong C++:
void (*signal (int sig, void (*func)(int)))(int);Hàm này nhận hai tham số: tham số đầu tiên là một số nguyên mà biểu diễn số hiệu tín hiệu (signal number) và tham số thứ hai là một con trỏ tới hàm xử lý tín hiệu.
Bây giờ, viết một chương trình C++ đơn giản để bắt tín hiệu SIGINT bởi sử dụng hàm signal() trong C++. Bất cứ tín hiệu nào bạn muốn bắt trong chương trình, bạn phải ghi tín hiệu đó bởi sử dụng hàm signal và liên kết nó với một Signal Handler. Bạn xét ví dụ:
#include <iostream>
#include <csignal>
using namespace std;
void signalHandler( int tinhieuso )
{
cout << "Tin hieu ngung chuong trinh (" << tinhieuso << ") da duoc nhan.\n";
// ket thuc chuong trinh
exit(tinhieuso);
}
int main ()
{
// dang ky tin hieu SIGINT va Signal Handler
signal(SIGINT, signalHandler);
while(1){
cout << "Going to sleep...." << endl;
}
return 0;
}Biên dịch và chạy chương trình C++ trên sẽ cho kết quả sau:

Bây giờ, nhấn CTRL+C để ngắt chương trình và bạn sẽ thấy rằng chương trình sẽ bắt tín hiệu này và sẽ in cái gì đó như sau:
Going to sleep....
Going to sleep....
Going to sleep....
Tin hieu ngung chuong trinh (2) da duoc nhan.Hàm raise() trong C++
Bạn có thể tạo các tín hiệu bởi hàm raise() trong C++, mà nhận một số integer biểu diễn signal number như một tham số và có cú pháp như sau:
int raise (signal sig);Ở đây, sig là signal number để gửi bất kỳ loại tín hiệu nào: SIGINT, SIGABRT, SIGFPE, SIGILL, SIGSEGV, SIGTERM, SIGHUP. Dưới đây là ví dụ tạo một tín hiệu nội tại bởi sử dụng hàm raise() trong C++, như sau:
#include <iostream>
#include <csignal>
using namespace std;
void signalHandler( int tinhieuso )
{
cout << "Tin hieu ngung chuong trinh (" << tinhieuso << ") da duoc nhan.\n";
// ket thuc chuong trinh
exit(tinhieuso);
}
int main ()
{
int i = 0;
// dang ky tin hieu SIGINT va Signal Handler
signal(SIGINT, signalHandler);
while(++i){
cout << "Going to sleep ... (Met Wa roi!!!)" << endl;
if( i == 7 ){
raise( SIGINT);
}
}
return 0;
}Biên dịch và chạy chương trình C++ trên sẽ cho kết quả sau:

Theo Tutorialspoint
Bài trước: Bộ tiền xử lý (Preprocessor) trong C++
Bài tiếp: Đa luồng (Multithread) trong C++
Bạn nên đọc
Theo Nghị định 147/2024/ND-CP, bạn cần xác thực tài khoản trước khi sử dụng tính năng này. Chúng tôi sẽ gửi mã xác thực qua SMS hoặc Zalo tới số điện thoại mà bạn nhập dưới đây:
Cũ vẫn chất
-

Cách chuyển ảnh sang PDF trên iPhone cực đơn giản
Hôm qua -

Công thức tính Diện tích hình vuông, tính Chu vi hình vuông
Hôm qua 2 -

Cách tải video Facebook nhóm kín, tải video Facebook riêng tư
Hôm qua -

9 cách xuống dòng trong Excel dễ nhất
Hôm qua 8 -

Những bài thơ về Mẹ hay và ý nghĩa chạm tới trái tim người đọc
Hôm qua 2 -

Cách không nhận tin nhắn người lạ trên Messenger
Hôm qua -

Hướng dẫn tải Honor of Kings server Brazil
Hôm qua -

Cách tạo kiểu chữ uốn cong trên Word
Hôm qua -

Cap về cà phê, stt về cà phê hay, ngắn gọn cho mọi tâm trạng
Hôm qua 1 -

Số nguyên là gì? Số nguyên dương là gì? Số nguyên âm là gì?
Hôm qua
Học IT
Công nghệ
Microsoft Word 2013
Microsoft Word 2007
Microsoft Excel 2019
Microsoft Excel 2016
Microsoft PowerPoint 2019
Google Sheets
Lập trình Scratch
Bootstrap
Hướng dẫn
Ô tô, Xe máy