SV atomum fs üzerinde mi?


13

mvFs (ext4) üzerinde atomik olup olmadığını nasıl kontrol edebilirim ?

İşletim sistemi Red Hat Enterprise Linux Server sürüm 6.8'dir.

Genel olarak, bunu nasıl kontrol edebilirim? Etrafa baktım ve işletim sistemimin standart POSIX olup olmadığını bulamadım.


Denedin stracemi
Wildcard

Yanıtlar:


9

İlginçtir ki, cevap "Bağlıdır" olabilir.

Açık olmak gerekirse, mvbelirtilen etmek

Yardımcı mvprogram, rename() işleve eşdeğer eylemler gerçekleştirmelidir

Yeniden adlandırma işlevi belirtimi şunları belirtir:

Bu rename()işlev, normal dosyalar için ISO C standardında tanımlanan işlevle eşdeğerdir. Buraya eklenmesi, bu tanımı dizinlerdeki eylemleri içerecek şekilde genişletir ve yeni parametre zaten var olan bir dosyayı adlandırdığında davranışı belirtir. Bu belirtim, işlevin eyleminin atomik olmasını gerektirir.

Ama son ISO C şartname için rename()devletler:

7.21.4.2 renameİşlev

özet

#include <stdio.h>
int rename(const char *old, const char *new);

Açıklama

renameFonksiyon Adını tarafından işaret dizedir dosyayı neden oldbundan böyle tarafından işaret dize verilen ad olarak bilinmek new. Adlı dosyaya oldartık bu adla erişilemiyor. İşlevin newçağrılmasından önce tarafından işaret edilen dize tarafından adlandırılan bir dosya varsa rename, davranış uygulama tanımlıdır.

İadeler

renameİşlevini verir operasyon başarılı olursa sıfır, sıfırdan farklı başarısız olursa, bu durumda dosya daha önce yine de başlangıçtaki adıyla bilinir var olup olmadığını.

Şaşırtıcı bir şekilde, atomisite için açık bir gereklilik olmadığını unutmayın. En son halka açık C Standardında başka bir yerde gerekli olabilir, ancak bulamadım. Herkes böyle bir gereksinim bulabilirse, düzenlemeler ve yorumlar hoş geldiniz daha fazladır.

Ayrıca bkz. Rename () atomik mi?

Başına Linux kılavuz sayfasında :

Eğer newpathzaten var erişmeye çalıştığı bir başka süreç hangi anlamı yok ki, bu atomik değiştirilir newpatheksik bulacaksınız. Ancak, muhtemelen her ikisi de bir penceredir olacak oldpathve newpathdosyaya bakınız değiştiriliyor.

Linux kılavuz sayfası dosyanın değiştirilmesinin atomik olacağını iddia ediyor .

Bununla birlikte, atomisitenin çok zor olabileceğini test etmek ve doğrulamak , ne kadar ileri giderseniz. "Mv'nin atomik olup olmadığını nasıl kontrol edebilirim?" Atomik olan gereksinimler / özellikler / belgeler mi istiyorsunuz, yoksa gerçekten test etmeniz mi gerekiyor?

Ayrıca, yukarıdaki iki işlenen dosya adının aynı dosya sisteminde olduğunu varsayar . Bunu mvuygulamak için yardımcı program üzerinde standart bir kısıtlama bulamıyorum .


Hareketin atomik olduğundan emin olmalıyım. Test bunu kabul etmek için yeterli mi? Söyleyemem. Evet, aynı fs üzerinde çalışıyorum (ext4'ten ext4'e).
Tizianoreica

1
POSIX de atomikliği garanti etmez, ancak Linux, çoğu unix varyantı gibi ext4 gibi "yerel" dosya sistemleri için de yapar.
Gilles 'SO- kötü olmayı bırak

1
ISO C'nin bütün bir sistemin değil, yalnızca bir programın davranışını tanımladığı göz önüne alındığında, renameatomiklik hakkında bir şey söylemesi tuhaf olurdu .
Gilles 'SO- kötü olmayı bırak'

3
POSIX belgesinin önceki bölümlerini ("new adlı bir bağlantı, boyunca diğer iş parçacıklarına görünür kalır ve yeni ya da eski tarafından atıfta bulunulan dosyaya başvurur ... "). Başka bir deyişle, POSIX ISO C standardını uygulamayı vaat eder ve ISO C'nin sunduklarının ötesinde ek garantiler verir. Bu yorum yardımcı olur mu?
SimonJ

1
@Tizianoreica Bunun eski bir yazı olduğunu biliyorum, ama sadece yorumunu gördüm ve açıklığa kavuşturmam gerektiğini düşündüm: Yeniden adlandırmanın atomik olması için gerçek dosya sistemi aynı olmalı. Sadece aynı tip dosya sisteminin. Örneğin /, bir ext4 fs ve /tmpfarklı bir ext4 fs olarak sahipseniz , atomik olarak birinden diğerine geçemezsiniz .
Wodin


-1

Sistem çağrılarını ve atomisitelerini kontrol etmenin yanı sıra, belki inotify-toolsde bir test görevi görebilir, ancak bunun garantili bir atomisite kanıtı olup olmadığından emin değilim.

2 mermi açın. Bunlardan birinde taşınmanın hedef dizinini izleyin:

inotifywait -m target/

Bir dosyayı diğerindeki dizine taşıyın:

mv foobar target/

inotifywaitSadece bir hattı göstermelidir:

target/ MOVED_TO foobar

Aşağıdaki gibi çok satırlı mesajlar üreten ls target/ve yanıt veren atomik görünüyor touch target/a:

# the response to ls target/
target/ OPEN,ISDIR 
target/ ACCESS,ISDIR 
target/ CLOSE_NOWRITE,CLOSE,ISDIR 

PS

Sanırım, en azından dosyalar üzerinde asenkron çok işlemcili işbirliğinin inotify(pratik olarak atomik) ile güvenli olduğunu gösteriyor : her durumda inotify, işlemden sonra son sinyali verdikten sonra cevap verirdiniz . Örneğin, üretici-tüketici kurulumu kolay ve güvenli bir şekilde uygulanabilir inotify.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.