2015-04-13 13 views
6

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.

+1

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. –

+0

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. –

Trả lời

6

Sự cố bạn đang gặp phải là khi xử lý tệp được mở với FILE_FLAG_DELETE_ON_CLOSE bị đóng, hệ điều hành sẽ không cho phép tạo các xử lý mới nữa.

Chi tiết đẫm máu: Khi xử lý IRP_MJ_CLEANUP (đó là điều xảy ra khi xử lý được đóng) cho tệp được mở để xóa khi đóng, hệ thống tệp Windows sẽ đặt cờ nội bộ trên đối tượng tệp cho biết nó ra ngoài. Các lần thử mở tiếp theo trên tệp sẽ không thành công với STATUS_DELETE_PENDING, hệ thống con Win32 sẽ ánh xạ tới mã Win32 ERROR_ACCESS_DENIED mà bạn đang xem.

Đối với trường hợp sử dụng của bạn, bạn có thể muốn xem xét sử dụng mẫu Named Shared Memory (MSDN). Về cơ bản, hãy để hệ điều hành quản lý không gian cho bộ nhớ dùng chung của bạn. Chỉ cần chắc chắn rằng bạn áp dụng các thuộc tính bảo mật thích hợp, và bạn tốt để đi.

+0

Cảm ơn bạn đã rõ ràng. Tôi đã tìm được nhiều thứ từ những gì tôi quan sát được từ phía bên trong. Cố gắng xóa trên đóng cờ là một bổ sung gần đây để phá vỡ người dùng phải thêm xử lý để kịch bản của họ. Đó là trường hợp hiếm hoi khi có sự cố và không được dọn dẹp đúng cách. Tôi sẽ xem xét sử dụng pagefile như một cửa hàng sao lưu thay thế cho các phần được ánh xạ bộ nhớ. Chi tiết Gory được đánh giá cao và hiểu rõ. – cdturner

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