Saya memiliki dua cangkang terbuka. Yang pertama adalah di direktori A. Di yang kedua, saya menghapus direktori A, dan kemudian membuatnya kembali. Ketika saya kembali ke shell pertama, dan ketik ls
, outputnya adalah:
ls: cannot open directory .: Stale file handle
Mengapa? Saya pikir shell pertama (yang tetap terbuka di dalam direktori yang tidak ada) akan "membeku" sambil menunggu perintah berikutnya, dan tidak akan "menyadari" bahwa direktori itu dihapus dan diciptakan kembali. Apakah shell menyimpan referensi "lebih dalam" ke direktori kerjanya saat ini selain string $PWD
?
bash
filesystems
open-files
pwd
fonini
sumber
sumber
cd $PWD
.Jawaban:
Direktori (seperti file apa pun) tidak ditentukan oleh namanya. Pikirkan nama tersebut sebagai alamat direktori . Ketika Anda memindahkan direktori, itu masih direktori yang sama, seperti jika Anda pindah ke rumah yang berbeda, Anda masih orang yang sama. Jika Anda menghapus direktori dan membuat yang baru dengan nama yang sama, itu adalah direktori baru, sama seperti seseorang yang pindah ke rumah tempat Anda dulu tinggal bukan.
Setiap proses memiliki direktori yang berfungsi . The
cd
perintah di shell mengubah direktori kerja shell saat ini. Thepwd
perintah mencetak the¹ path ke direktori kerja saat ini.Ketika Anda menghapus direktori A, yang dilakukan adalah menghapus entri untuk A di direktori induknya. Direktori A sendiri tetap berada di sistem file, tetapi dalam keadaan terpisah, tanpa nama. Itu belum dihapus karena sedang digunakan oleh suatu proses, yaitu shell pertama. Ketika Anda mengubah direktori di shell pertama, direktori itu akhirnya dihapus. Hal yang sama terjadi ketika file dihapus saat proses masih terbuka: entri direktori file segera dihapus, dan file itu sendiri dihapus ketika berhenti digunakan.
Demikian pula, amati apa yang terjadi ketika Anda memindahkan direktori.
Di shell lain:
Di shell pertama:
File
1
ada di direktori yang awalnya dipanggilone
dan sekarang dipanggiltwo
. File2
ada di direktori yang awalnya dipanggiltwo
dan sekarang dipanggilone
.¹ Lebih tepatnya, sebuah jalan, yang mungkin tidak unik jika link simbolik atau kehalusan lain yang terlibat.
sumber
/proc/<pid>/cwd
, yang berfungsi seperti/proc/<pid>/fd/<number>
. AdaCWD
dalam output darilsof
.cd - && cd -
dalam kasus seperti itu?Direktori baru A tidak sama dengan direktori A. Ini dapat diperiksa dengan
stat
perintah sebelum menghapus yang lama dan setelah membuat yang baru dan Anda akan melihat nomor i-simpul yang berbeda.Dan saya pikir ini terkait dengan cara kerja kernel. Itu hanya melacak nomor-i dari direktori saat ini untuk setiap proses. Jadi karena ada nomor-i yang berbeda, ini akan menyebabkan tabrakan yang berbeda.
sumber
Ini adalah perilaku yang diharapkan. Direktori baru A tidak sama dengan direktori lama A, kebetulan saja memiliki nama yang sama. Jadi $ PWD terminal pertama masih hilang, itu tidak secara ajaib muncul kembali ketika Anda melakukannya
mkdir A
.sumber
Direktori, seperti file, memiliki inode yang terkait dengannya:
307% mkdir ABC
308% ls -i 11997708 A 11997709 B 11997710 C
Inode adalah struktur data yang berisi informasi tentang direktori atau file. Setiap direktori dan file memiliki satu. Anggap saja sebagai alamat (nomor indeks benar-benar).
Jika saya berada di A, nomor inode 11997708 dan di shell lain (atau di shell yang sama seperti yang akan saya lakukan) hapus direktori A kemudian buat kembali dan ls inode:
309% cd A
310% rmdir ../A
311% mkdir ../A
312% ls -i ..
11997720 A 11997709 B 11997710 C
Node saya berbeda, jadi jika mencoba membuat file di direktori yang dihapus A:
313% sentuh ini
sentuh: tidak dapat menyentuh 'ini': Tidak ada file atau direktori tersebut
karena direktori saya di - tidak lagi terkait dengan inode 11997720 - jadi di mana saya saat ini tidak lagi memiliki alamat / indeks - inode yang sah. Demikianlah kesalahannya.
sumber