Số CreateFile
của Win32 có FILE_FLAG_DELETE_ON_CLOSE
, nhưng tôi đang sử dụng Linux.Xóa tệp được đảm bảo khi chấm dứt chương trình (C/C++)
Tôi muốn mở tệp tạm thời sẽ luôn bị xóa khi chấm dứt chương trình. Tôi có thể hiểu rằng trong trường hợp của một vụ tai nạn chương trình nó có thể không thực tế để đảm bảo điều này, nhưng trong bất kỳ trường hợp nào khác tôi muốn nó hoạt động.
Tôi biết về RAII. Tôi biết về tín hiệu. Tôi biết về atexit(3)
. Tôi biết tôi có thể mở tệp và xóa tệp đó ngay lập tức và tệp sẽ vẫn có thể truy cập được cho đến khi trình mô tả tệp được đóng (thậm chí có thể xử lý sự cố). Không ai trong số này có vẻ như một giải pháp hoàn chỉnh và đơn giản:
- RAII: ở đó, thực hiện điều đó: Tôi có một đối tượng có destructor xóa tệp, nhưng hủy không được gọi nếu chương trình bị chấm dứt bởi tín hiệu. Tín hiệu
- : Tôi đang viết thư viện cấp thấp, điều này khiến cho việc đăng ký trình xử lý tín hiệu trở thành một đề xuất khó khăn. Ví dụ, nếu ứng dụng sử dụng chính các tín hiệu thì sao? Tôi không muốn bước lên bất kỳ ngón chân nào. Tôi có thể xem xét một số sử dụng thông minh của
sigaction(2)
để đối phó ... nhưng chưa đưa đủ suy nghĩ vào khả năng này. atexit(3)
: dường như vô dụng, vì nó không được gọi trong khi chấm dứt bất thường (ví dụ: thông qua tín hiệu).- preemptive
unlink(2)
: điều này khá tốt ngoại trừ việc tôi cần tệp để hiển thị trong hệ thống tệp (nếu không hệ thống sẽ khó giám sát/khắc phục sự cố).
Bạn sẽ làm gì ở đây?
giải thích thêm
tôi elided một chi tiết trong bài viết ban đầu của tôi mà tôi bây giờ nhận ra tôi nên tôi đã bao gồm. "Tệp" trong trường hợp này không phải là một tệp bình thường, mà là một Hàng đợi Thông báo POSIX. Tôi tạo nó qua mq_open()
. Nó có thể được đóng lại thông qua mq_close()
hoặc close()
(trước đây là một bí danh cho sau này trên hệ thống của tôi). Nó có thể được gỡ bỏ khỏi hệ thống thông qua mq_unlink()
. Tất cả điều này làm cho nó tương tự như một tệp thông thường, ngoại trừ mà tôi không thể chọn thư mục chứa tệp. Điều này làm cho câu trả lời phổ biến nhất hiện nay (đặt các tập tin trong /tmp
) unworkable, bởi vì "tập tin" được tạo ra bởi hệ thống trong một hệ thống tập tin ảo với công suất rất hạn chế. (Tôi đã gắn hệ thống tệp ảo trong /dev/mqueue
, theo ví dụ trong man mq_overview
).
Điều này cũng giải thích tại sao tôi cần tên để hiển thị (làm cho cách tiếp cận ngay lập tức-hủy liên kết không thể thực hiện được): "tệp" phải được chia sẻ giữa hai hoặc nhiều quy trình.
Đây là mục 4 (giữ tên có thể truy cập được) khiến nó trở nên khó khăn. –
Mỗi khi một chi tiết quan trọng bị bỏ đi, câu trả lời sẽ trở nên tồi tệ. Bạn sẽ biết trong thời gian tới. –