2015-04-13 16 views
6

Bellek eşlemeli dosya olarak kullanmak için bir dosya oluşturuyoruz.Herhangi bir tanıtıcı kapatıldıktan sonra CreateFile FILE_FLAG_DELETE_ON_CLOSE başarısız olur

biz dosya başarıyla dosyası oluşturmak FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE

özelliklerini kullanmasına biz FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE
ile pay kullanmak GENERIC_READ | GENERIC_WRITE
ile açın. İstediğimiz gibi aynı bayraklarla tekrar tekrar açabiliriz.

Bir tutamaç kapatıldıktan sonra, artık tutamaçları açamaz, ERROR_ACCESS_DENIED ile döner. Bu tutamaçlardan herhangi birini, ilk olarak CreateFile (ALWAYS_CREATE) veya CreateFile (OPEN_EXISTING) öğelerinden birini kapatarak neden olabiliriz.

Bundan kaçınmanın bir yolu var mı? MemoryMappedFile, kaynakları paylaşması gereken farklı işlemler arasında iletişim olarak kullanıyoruz. Bu süreçler bazen başlar ve durur. Şu anda bir tutamacı kapatır kapatmaz, hafızadaki dosyayı açamadık.

Açık çağrıları FILE_ATTRIBUTE_NORMAL kullanacak şekilde değiştirmeyi denedim, bu nedenle yalnızca oluşturma çağrısı CLOSE_ON_DELETE kullanıyor, ancak bu durum üzerinde hiçbir etkisi yok.

+1

süreçleriniz koordine edilmeli ve sadece "master", delete_on_close bayrağını kullanmalıdır, master ilk başlatılacak olan ve sonuncu kapanacak olan. –

+0

Yanlış soruna odaklanıyorsunuz. Evet, bu tür senaryolarda beklenmedik bir şekilde ölmekte olan bir süreçle baş etmek çok zordur. Silinmeyen bir dosyanın ötesinde birçok şey yanlış gidiyor, bir kilitlenme geleneksel. Sık sık başka hiçbir şey yapmayan bir koruma sürecine ihtiyacınız vardır, ancak herkesin, birlikte olmadıklarında işbirliği yapmasını ve temizlemesini sağlayın. Silinmeyen dosya, sorunun en azıdır, bir dahaki sefere alırsınız. –

cevap

6

Karşılaştığınız sorun, FILE_FLAG_DELETE_ON_CLOSE ile açılan bir dosya tanıtıcısı kapandığında, işletim sisteminin artık yeni tanıtıcıların oluşturulmasına izin vermeyeceğidir.

Gory ayrıntıları: Bir silme işlemi için açılmış bir dosya için bir IRP_MJ_CLEANUP (bu ne olur bir tanıtıcı kazanırsınız kapalı) işlenirken, Windows dosya sistemleri, dosya nesnesinin üzerinde olduğunu belirten bir iç bayrağı ayarlayacaktır. çıkış yolu. Dosyadaki sonraki açık denemeler, Win32 alt sisteminin, gördüğünüz Win32 ERROR_ACCESS_DENIED kodunu eşleyeceği STATUS_DELETE_PENDING ile başarısız olur.

Kullanım durumunuz için, Named Shared Memory (MSDN) modelini kullanmayı düşünebilirsiniz. Temel olarak, işletim sisteminin paylaşılan belleğiniz için alanı yönetmesine izin verin. Sadece uygun güvenlik özniteliklerini uyguladığınızdan emin olun ve gitmekte fayda var.

+0

Netlik için teşekkürler. Ben usermode tarafında gözlemlediklerimden çok düşündüm. Silinmeyi yakın bayrakta denemek, kullanıcıların komut dosyalarına işlem eklemesi gerekmeksizin atlatmak için yeni bir eklentiydi. Bir şey çöktüğünde ve düzgün bir şekilde temizlenmediğinde, nadir durumdaydı. Bellek eşlemeli bölümler için sayfa diski alternatif bir yedekleme deposu olarak kullanmaya çalışacağım. Gory ayrıntıları çok takdir ve anlaşılmış. – cdturner

İlgili konular