Apa yang terjadi pada pegangan file terbuka di Linux jika file yang ditunjuk sementara itu mendapatkan:
- Dipindahkan -> Apakah pegangan file tetap valid?
- Dihapus -> Apakah ini mengarah ke EBADF, menunjukkan pegangan file yang tidak valid?
- Diganti dengan file baru -> Apakah pegangan file mengarah ke file baru ini?
- Diganti oleh tautan keras ke file baru -> Apakah file saya menangani tautan "ikuti" ini?
- Diganti dengan tautan lunak ke file baru -> Apakah pegangan file saya mengenai file tautan lunak ini sekarang?
Mengapa saya mengajukan pertanyaan seperti itu: Saya menggunakan perangkat keras yang sudah dicolokkan panas (seperti perangkat USB, dll.). Ini bisa terjadi, bahwa perangkat (dan juga / dev / filenya) dilampirkan kembali oleh pengguna atau GREMLIN lain.
Apa praktik terbaik dalam menangani ini?
Tuas file mengarah ke inode bukan ke jalur, jadi sebagian besar skenario Anda masih berfungsi seperti yang Anda asumsikan, karena gagang masih mengarah ke file.
Secara khusus, dengan skenario hapus - fungsi ini disebut "unlink" karena suatu alasan, ini menghancurkan "link" antara nama file (dentry) dan file. Saat Anda membuka file, lalu membatalkan tautannya, file tersebut sebenarnya masih ada hingga jumlah referensinya mencapai nol, yaitu saat Anda menutup pegangannya.
Sunting: Dalam kasus perangkat keras, Anda telah membuka pegangan ke node perangkat tertentu, jika Anda mencabut perangkat, kernel akan gagal semua akses ke sana, bahkan jika perangkat kembali. Anda harus menutup perangkat dan membukanya kembali.
sumber
Saya tidak yakin tentang operasi lain, tetapi untuk penghapusan: Penghapusan tidak terjadi (secara fisik, yaitu dalam sistem file) sampai pegangan terbuka terakhir ke file ditutup. Oleh karena itu, tidak mungkin untuk menghapus file dari bawah aplikasi Anda.
Beberapa aplikasi (yang tidak terlintas dalam pikiran) mengandalkan perilaku ini, dengan membuat, membuka, dan segera menghapus file, yang kemudian hidup persis selama aplikasi - memungkinkan aplikasi lain untuk mengetahui siklus hidup aplikasi pertama tanpa perlu lihat peta proses dan semacamnya.
Mungkin pertimbangan serupa berlaku untuk hal-hal lain.
sumber
jika Anda ingin memeriksa apakah penangan file (deskriptor file) baik-baik saja, Anda dapat memanggil fungsi ini.
sumber
if(!fcntl(fd, F_GETFL)) {
cek? Saya kira Anda sedang mencari diEBADF
sana. (Anda mungkin juga lupa menginisialisasierrno
ke 0).open(O_WRONLY|O_APPEND)
- st_nlink always stay> = 1 saat deskriptor saya dibuka.Informasi dalam memori dari file yang dihapus (semua contoh yang Anda berikan adalah contoh file yang dihapus) serta inode pada disk tetap ada sampai file ditutup.
Perangkat keras yang sedang dicolokkan adalah masalah yang sama sekali berbeda, dan Anda seharusnya tidak mengharapkan program Anda tetap hidup jika inode atau metadata pada disk telah berubah sama sekali .
sumber
Eksperimen berikut menunjukkan bahwa jawaban MarkR benar.
code.c:
data:
Gunakan
gcc code.c
untuk menghasilkana.out
. Lari./a.out
. Ketika Anda melihat output berikut:Gunakan
rm data
untuk menghapusdata
. Tetapi./a.out
akan terus berjalan tanpa kesalahan dan menghasilkan seluruh keluaran berikut:Saya telah melakukan percobaan di Ubuntu 16.04.3.
sumber
Di bawah / proc / direktori Anda akan menemukan daftar setiap proses yang sedang aktif, cukup temukan PID Anda dan semua data tentang ada di sana. Info yang menarik adalah folder fd /, Anda akan menemukan semua penangan file yang sedang dibuka oleh proses tersebut.
Akhirnya Anda akan menemukan tautan simbolis ke perangkat Anda (di bawah / dev / atau bahkan / proc / bus / usb /), jika perangkat hang tautannya akan mati dan tidak mungkin untuk menyegarkan pegangan ini, prosesnya harus ditutup dan buka lagi (bahkan dengan koneksi ulang)
Kode ini dapat membaca status link PID Anda saat ini
Kode terakhir ini sederhana, Anda dapat bermain dengan fungsi linkat.
sumber