Hapus file versus ditimpa dan tautan di / proc / pid / fd

2

Sudah diketahui bahwa sistem UNIX tidak akan benar-benar menghapus file pada disk saat file sedang digunakan. Jadi jika file sedang diakses oleh proses 1 dan proses 2 menghapus file menggunakan rm, proses 1 terus melihat file; selain itu tautan deskriptor file di / proc / (proses 1 id) / fd melaporkan konten asli dari file yang dihapus.

Namun, jika proses 2 menimpa file yang bertentangan dengan menghapusnya (katakan dengan gema "abracadabra"> file.txt), tautan deskriptor file di / proc / (proses 1 id) / fd melaporkan bahan yang ditimpa ("abracadabra") , sementara proses 1 masih dapat mengakses konten asli file. Kenapa ada perbedaan ini?

[Sunting] Cuplikan di bawah ini menanggapi Jim Paris

>uname -a
Linux ravoori-netbook 3.2.0-32-generic-pae #51-Ubuntu SMP Wed Sep 26 21:54:23 UT
C 2012 i686 i686 i386 GNU/Linux
>echo original > /tmp/foo
>tail -0f /tmp/foo &
[2] 6144
>rm /tmp/foo
>cat /proc/6144/fd/3
original
>echo abracadabra > /tmp/foo
>cat /proc/6144/fd/3
original
iruvar
sumber
Setiap entri direktori adalah tautan keras ke file. Satu file dapat memiliki entri di banyak direktori (mis. Banyak tautan keras). Kernel akan mengklaim kembali blok disk setelah tautan terakhir ke file hilang. Sampai saat itu, pembatalan tautan hanya menghapus entri direktori - tidak ada hubungannya dengan isi file.
jw013
@ jw013, terima kasih. Sehubungan dengan skenario menimpa yang dijelaskan di atas, mengerti bahwa proses membaca terus melihat konten file asli tetapi mengapa deskriptor di bawah / proc / << ID proses >> / fd menunjuk ke konten baru? Ini berbeda dari skenario hapus di mana / proc / << ID proses >> / fd jelas menunjuk ke file asli
iruvar
Proses 1 memperoleh fd ke file. Proses 2 memperoleh fd ke file yang sama. Kedua proses melihat konten yang sama. Ini adalah perilaku yang wajar dan diharapkan. Apa pun yang ditulis satu proses yang lain dapat dilihat karena keduanya memiliki file yang sama terbuka.
jw013

Jawaban:

2

Jika proses 1 sudah mulai membaca file sebelum proses 2 menimpanya, maka akan ada beberapa bagian dari konten yang disimpan dalam stdiobuffer. Setelah melewati batas ukuran buffer, ia akan dipaksa untuk pergi ke kernel, dan kemudian akan menemukan konten baru yang ditimpa.

aecolley
sumber
2

Namun, jika proses 2 menimpa file yang bertentangan dengan menghapusnya (katakan dengan gema "abracadabra"> file.txt), tautan deskriptor file di / proc / (proses 1 id) / fd melaporkan bahan yang ditimpa ("abracadabra") , sedangkan proses 1 masih dapat mengakses konten asli file asli.

Saya tidak setuju:

$ echo original > /tmp/foo
$ tail -0f /tmp/foo &
[1] 20591
$ rm /tmp/foo
$ cat /proc/20591/fd/3
original
$ echo abracadabra > /tmp/foo
$ cat /proc/20591/fd/3
original

The fdLink masih menunjukkan isi asli, bertentangan dengan apa yang Anda diklaim. Ini dengan Linux 3.5. Apakah Anda melihat sesuatu yang berbeda?

Jim Paris
sumber
Saya melihat perilaku yang berbeda. Silakan merujuk cuplikan ditambahkan ke pertanyaan asli.
iruvar
Sebenarnya, cuplikan Anda di atas tampaknya membuktikan maksud saya. Abracadabra yang ditampilkan oleh kucing terakhir berbeda dari konten aslinya. Namun, prosedur yang sama ini ketika dijalankan pada pengaturan saya memberikan hasil yang bertentangan dengan poin awal saya. Pertanyaan asli berkaitan dengan situasi produksi yang melibatkan proses di bawah sesi yang berbeda perlahan-lahan melalui file-file besar sehingga stdio buffering yang dirujuk oleh aecolley mungkin ada hubungannya dengan itu.
iruvar
Ups, Anda benar, saya mengedit transkrip itu dan mengacaukan bagian terpenting! Saya menjalankan perintah lagi dan mereka cocok dengan output Anda; Saya akan memperbaiki cuplikannya.
Jim Paris