Tôi trả lời là người dùng Linux, nhưng tất cả điều này nên áp dụng cho các cửa sổ.
Tôi đã có câu hỏi tương tự này, vì vậy hy vọng tôi có thể tổng hợp các câu trả lời trước đó và thêm hai xu của tôi.
Tín hiệu và abort()
: ^C
và ^Z
có thể bị "chặn" để gọi chức năng của bạn trước khi thoát, có lẽ với exit(). Các tín hiệu SIGQUIT
AKA ^\
và SIGKILL
không bị chặn đột quỵ. Đây là một ví dụ để sử dụng tiêu đề csignal
và một lambda C++.
#include <iostream>
#include <csignal>
#include <cstdlib>
using namespace std;
int main()
{
//signal requires lam take an int parameter
//this parameter is equal to the signals value
auto lam =
[] (int i) { cout << "aborting" << endl; exit(0); };
//^C
signal(SIGINT, lam);
//abort()
signal(SIGABRT, lam);
//sent by "kill" command
signal(SIGTERM, lam);
//^Z
signal(SIGTSTP, lam);
while(1)
{
}
return 0;
}
Thoát: Vì tôi đã sử dụng exit()
trong các ví dụ ở trên, cần lưu ý ở đây. Nếu chức năng đang chạy là một chức năng dọn dẹp chỉ cần chạy một lần, có lẽ một biến tĩnh has_run
có thể được sử dụng. Hoặc trong ví dụ trên, raise()
tín hiệu mà bạn không thể chặn. Nhưng những người có xu hướng đi kèm với bãi lõi mà chỉ cảm thấy bẩn. Lựa chọn của bạn, ở đây. Một ví dụ sau
#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
//called with no parameters
auto lam = []() { cout << "at exit"; };
atexit(lam);
return 0;
}
Hãy lưu ý rằng C++ 11 thêm một quick_exit
trong đó có một kèm at_quick_exit
mà hành động tương tự như trên.Nhưng với quick_exit
không có công việc làm sạch nào được thực hiện. Ngược lại, với exit
các trình phá hủy đối tượng được gọi và luồng C bị đóng, chỉ với các biến lưu trữ tự động không bị xóa.
Nguồn
2015-11-12 09:56:47
Không thể xảy ra trong mọi trường hợp - một số tín hiệu đưa ra quá trình ngay lập tức cho dù bạn có muốn hay không. (ví dụ: tràn ngăn xếp) –
Hệ điều hành nào? –