2010-07-29 30 views
7

Tôi đang làm việc trên một chương trình sử dụng bộ nhớ dùng chung. Nhiều phiên bản của chương trình đã nói sẽ kết nối với một chương trình hiện có hoặc tạo lại nó và cung cấp lại cho hệ điều hành khi không có quy trình nào khác hoặc chỉ tách nó ra và chấm dứt. Tôi đã nghĩ đến việc sử dụng một bộ đếm đơn giản để theo dõi xem có bao nhiêu quá trình sử dụng nó.Làm thế nào để làm sạch sau SIGKILL?

Tôi đang sử dụng chức năng atexit() để làm sạch, tuy nhiên, khi nhận tín hiệu SIGKILL, quy trình sẽ không thực hiện bất kỳ việc dọn dẹp nào, vì vậy nếu bất kỳ quy trình nào không kết thúc bình thường, tôi có thể không bao giờ có thể làm sạch bộ nhớ.

Có cách nào để chỉ định việc cần làm ngay cả sau khi có tín hiệu SIGKILL không? Tôi có lẽ sẽ viết một số cơ chế tương tự như một bộ đếm thời gian để kiểm tra xem các quá trình vẫn còn sống, nhưng tôi thực sự muốn tránh nó nếu có một cách khác.

Trả lời

16

Không, SIGKILL không thể bị ứng dụng của bạn chặn lại - nếu có thể, ứng dụng có thể bỏ qua nó, điều này sẽ đánh bại mục đích của nó.

13

Bạn không thể bắt SIGKILL.

Tuy nhiên: bạn có thể vẫn làm sạch, miễn là dọn dẹp được thực hiện bởi một quy trình khác. Có rất nhiều chiến lược bạn có thể đi với ở đây để cho quá trình vệ sinh của bạn thấy các quy trình khác của bạn xuất hiện và biến mất.

Ví dụ: bạn có thể có một ổ cắm miền Unix ở một vị trí đã biết, mà người quản gia lắng nghe; mỗi quá trình nô lệ mở ổ cắm để cho biết nó đang sử dụng phân đoạn bộ nhớ chia sẻ. Khi một nô lệ thoát, vì lý do gì đó, ổ cắm sẽ bị đóng lại. Người quản gia có thể thấy điều này xảy ra và có thể làm sạch.

+0

+1 để giải thích khái niệm – Robert

4

Kết hợp với bộ nhớ dùng chung, mutexes mạnh mẽ nằm trong phân đoạn bộ nhớ dùng chung sẽ là công cụ tuyệt vời. Nếu một quá trình chết trong khi giữ một khóa trên một mutex mạnh mẽ, quá trình tiếp theo để cố gắng khóa nó sẽ nhận được EOWNERDEAD và có thể thực hiện việc dọn dẹp mà chủ sở hữu ban đầu đã thực hiện.

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