Chúng tôi tạo một tệp để sử dụng làm tệp memorymappedfile.CreateFile FILE_FLAG_DELETE_ON_CLOSE không thành công sau khi bất kỳ tay cầm nào đã bị đóng
chúng tôi mở ra với GENERIC_READ | GENERIC_WRITE
chúng tôi sử dụng chia sẻ với FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE
chúng tôi sử dụng thuộc tính tập tin FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE
chúng ta tạo ra các tập tin thành công. Chúng ta có thể mở lại nó nhiều lần với những lá cờ giống như chúng ta muốn.
Khi một lần xử lý đã bị đóng, chúng tôi không còn có thể mở thêm bất kỳ xử lý nào nữa, nó sẽ trả về với ERROR_ACCESS_DENIED. Chúng ta có thể gây ra điều này bằng cách đóng bất kỳ chốt điều khiển nào, hoặc là đầu tiên từ CreateFile (ALWAYS_CREATE), hoặc những thứ khác từ CreateFile (OPEN_EXISTING).
Có cách nào để tránh điều này không? Chúng tôi sử dụng memoryMappedFile làm thông tin liên lạc giữa các quy trình khác nhau phải chia sẻ tài nguyên. các quá trình này đôi khi bắt đầu và dừng lại. Ngay bây giờ ngay sau khi chúng tôi đóng một xử lý, chúng tôi đang mắc kẹt không thể mở memorymappedfile.
Tôi đã thử thay đổi cuộc gọi đang mở để sử dụng FILE_ATTRIBUTE_NORMAL, vì vậy chỉ cuộc gọi tạo sử dụng CLOSE_ON_DELETE nhưng điều đó không ảnh hưởng đến tình huống này.
quy trình của bạn nên phối hợp và chỉ có "tổng thể" nên sử dụng cờ delete_on_close, cờ chính là người đầu tiên khởi động và người cuối cùng ngừng hoạt động. –
Bạn đang tập trung vào vấn đề sai. Vâng, rất khó để đối phó với một quá trình chết bất ngờ trong loại kịch bản này. Nhiều thứ khác đi sai ngoài tập tin không bị xóa, bế tắc là truyền thống. Bạn thường cần một quá trình bảo vệ mà không làm bất cứ điều gì khác nhưng đảm bảo rằng tất cả mọi người hợp tác và làm sạch khi họ không. Tập tin đó không bị xóa là ít nhất của vấn đề, bạn sẽ nhận được nó trong thời gian tới. –