1. Trang chủ
  2. » Thể loại khác

Xử lý tín hiệu (Signal Handling) trong C++ | 101 bài hướng dẫn C++ hay nhất PDF cpp signal handling

4 268 2

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 4
Dung lượng 346,9 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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ể

Trang 1

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>

động làm tràn luồng (overflow)

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 integer 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

Trang 2

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àmsignal() 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 signum )

{

cout << "Interrupt signal (" << signum << ") received.\n" ;

// cleanup and close up stuff here

// terminate program

exit( signum );

}

int main ()

{

// register signal SIGINT and signal handler

signal ( SIGINT , signalHandler );

while( ){

cout << "Going to sleep " << endl ;

sleep ( );

}

return ;

}

Khi code trên được biên dịch và thực thi, nó cho kết quả sau:

Trang 3

Going to sleep

Going to sleep

Going to sleep

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

Interrupt signal ( ) received

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 signum )

{

cout << "Interrupt signal (" << signum << ") received.\n" ;

// cleanup and close up stuff here

// terminate program

exit( signum );

Trang 4

int main ()

{

int i = 0

// register signal SIGINT and signal handler

signal ( SIGINT , signalHandler );

while(++ i ){

cout << "Going to sleep " << endl ;

if( i == ){

raise( SIGINT );

}

sleep ( );

}

return ;

}

Biên dịch và thực thi code trên, nó sẽ cho kết quả sau:

Going to sleep

Going to sleep

Going to sleep

Interrupt signal ( ) received

Ngày đăng: 02/12/2017, 13:59

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm