2011-06-06 32 views
7

Tôi đang viết một chương trình đa luồng nơi tôi muốn xử lý một lệnh Ctrl-C có thể từ người dùng để chấm dứt thực hiện. Theo như tôi biết không có đảm bảo rằng các chủ đề chính, mà có thể hủy bỏ tất cả các chủ đề làm việc, sẽ bắt tín hiệu. Do đó, cần thiết phải có một trình xử lý tín hiệu khác với mã của luồng làm việc sao cho bất cứ ai cũng sẽ nhận được tín hiệu nếu nó đến, hoặc có cách nào khác để thực hiện điều đó bằng việc chỉ xử lý tín hiệu trong mã của luồng chính không?bắt SIGINT trong một chương trình đa luồng

Trả lời

8

Bạn có thể chặn tín hiệu từ chuỗi cuộc gọi bằng pthread_sigmask().

Và vì các tín hiệu bị chặn được kế thừa cho các chuỗi mới tạo, bạn có thể chặn SIGINT trong chuỗi chính, sau đó khởi chạy các chủ đề khác của bạn và sau đó bỏ chặn nó trong chuỗi chính, nếu thích hợp hơn.

+0

nhưng cách này không phải là đi một tín hiệu sigint bị mất nếu một chủ đề con xảy ra để bắt nó và chỉ đơn giản là bỏ qua nó? – nikos

+1

@nikos: Vâng, nhưng tôi không thấy mối quan hệ với những gì tôi đang viết; Nếu một luồng chặn một tín hiệu nó không thể, theo định nghĩa, bắt nó. – janneb

+1

@nikos: Một tín hiệu không bao giờ được gửi tới một chuỗi bị chặn (ví dụ: sử dụng 'pthread_sigmask()') - điều này khác với chuỗi bắt và bỏ qua nó. Nếu tất cả các luồng luồng chủ đề chính có 'SIGINT' bị chặn thì nó sẽ luôn được gửi đến luồng chính. – caf

Các vấn đề liên quan