Khi giao dịch với tín hiệu POSIX, bạn có hai phương tiện theo ý của bạn. Thứ nhất, cách dễ dàng (nhưng không được chấp nhận), signal(). Thứ hai, cách thanh lịch, hiện tại nhưng phức tạp hơn, sigaction(). Vui lòng sử dụng sigaction() trừ khi bạn thấy rằng nó không có sẵn trên một số nền tảng mà bạn cần phải làm việc trên.
This chapter hướng dẫn sử dụng glibc giải thích sự khác biệt giữa hai và cung cấp mã ví dụ tốt về cách sử dụng cả hai. Nó cũng liệt kê các tín hiệu có thể được xử lý, đề nghị cách nên xử lý và tìm hiểu sâu hơn về cách cho biết bất kỳ tín hiệu nào đã cho (hoặc không) hiện đang xử lý . Đó là cách mã nhiều hơn tôi muốn dán vào một câu trả lời ở đây, do đó các liên kết.
Nó thực sự đáng giá một hoặc hai giờ nó sẽ đưa bạn đến đọc các liên kết và làm việc thông qua các ví dụ. Xử lý tín hiệu (đặc biệt là trong các chương trình daemonize) là cực kỳ quan trọng. Một chương trình tốt nên xử lý tất cả các tín hiệu gây tử vong có thể được xử lý (nghĩa là SIGHUP) và bỏ qua một cách rõ ràng các tín hiệu mà nó có thể không sử dụng (ví dụ: SIGUSR1/SIGUSR2). Nó cũng sẽ không làm tổn thương để nghiên cứu sự khác biệt giữa tín hiệu thời gian bình thường và thời gian thực, ít nhất là lên đến sự hiểu biết về cách hạt nhân sáp nhập trước và không phải là sau này.
Khi bạn làm việc thông qua nó, bạn có thể cảm thấy có xu hướng viết lên một cách dễ dàng để sửa đổi tập hợp các chức năng để xử lý tín hiệu của bạn và sử dụng lại mã đó nhiều lần.
Xin lỗi vì đã không đưa ra một đoạn mã nhanh chóng và dơ bẩn để cho bạn thấy làm thế nào để giải quyết nhu cầu trước mắt của bạn, nhưng điều này không phải là một chủ đề nhanh chóng và dơ bẩn :)
Nguồn
2010-03-21 01:34:51
tôi sẽ không đề nghị này. Có rất ít trường hợp, tôi có thể nghĩ về một ý tưởng hay cho một chương trình để ghi đè chức năng giết của Ctrl-C - một công cụ kết nối từ xa như SSH là một trong số chúng. –
Đây chỉ là một sự hiểu biết về cách xử lý tín hiệu – Dave
Bất kỳ loại chương trình thông dịch viên nào cũng nên bắt ctrl-C để hủy bỏ chương trình được lưu trữ, nếu chương trình đang chạy. – Potatoswatter