Dosyayı dosya sistemi sınırları boyunca geçirmediğiniz sürece, işlem güvenli olmalıdır. Bu, mekanizma nedeniyle, “hareket etme” işleminin gerçekte nasıl yapıldığına bağlıdır.
Eğer mv
aynı dosya sisteminde bir dosya, dosyanın gerçekten dokundu değil, yalnızca dosya sistemi kayıt değiştirilir.
$ mv foo bar
aslında böyle bir şey yapar
$ ln foo bar
$ rm foo
Bu yaratacak sert dosyası (aslında inode dosya sistemi girişi ile işaret) bağlantısını (ikinci dizin girdisi) foo
adında bar
ve kaldırmak foo
girişi. Şimdi kaldırırken foo
, foo
inode'a işaret eden ikinci bir dosya sistemi girişi var , eski girişi foo
kaldırmak aslında inode'a ait herhangi bir bloğu kaldırmıyor.
Açık dosya tanıtıcısı, dosya sistemi girişini değil, dosya inode'unu işaret ettiğinden, programınız yine de dosyaya ekler.
Not: Programınız yazarlar arasındaki dosyayı kapatır ve yeniden açarsa , eski dosya sistemi girişi ile oluşturulmuş yeni bir dosyaya sahip olursunuz !
Çapraz dosya sistemi hamleleri:
Dosyayı dosya sistemi sınırları boyunca taşırsanız, işler çirkinleşir. Bu durumda, dosyanızın tutarlı kalmasını garanti edemezsiniz, çünkü mv
aslında
- hedef dosya sisteminde yeni bir dosya yarat
- eski dosyanın içeriğini yeni dosyaya kopyala
- eski dosyayı kaldır
veya
$ cp /path/to/foo /path/to/bar
$ rm /path/to/foo
Resp.
$ touch /path/to/bar
$ cat < /path/to/foo > /path/to/bar
$ rm /path/to/foo
Uygulamanızın yazılması sırasında kopyalamanın dosyanın sonuna ulaşıp ulaşmadığına bağlı olarak, yeni dosyada satırın yalnızca yarısına sahip olabilirsiniz.
Ayrıca, uygulamanız eski dosyayı kapatıp yeniden açmazsa, silinmiş gibi görünse bile eski dosyaya yazmaya devam eder: çekirdek, hangi dosyaların açık olduğunu ve dosya sistemi girişini silecek olsa da uygulamanızın açık dosya tanıtıcısını kapatana kadar eski dosyanın inode ve ilgili bloklarını silmez.
rename()
sistem çağrısı yoktu . Yanimv
aslında orjinal versiyonulink()
sabit bağlantıyı oluşturmak için çağrı yaptım , ardındanunlink()
orjinal ismi kaldırdık.rename()
Bunu atomik olarak çekirdeğe uygulamak için FreeBSD'ye ilave edildi.