Що означає "застаріла обробка файлу" в Linux?


100

Скажімо, у мене відкритий термінал, і через цей термінал я перейшов cdу якийсь каталог. Через інший термінал я видаляю цей каталог і відновлюю його з ідентичної резервної копії. Чому під час спроби vimотримати файл із першого терміналу в тому ж каталозі з’являється повідомлення про помилку застарілого файлу? Що це означає? (У додатковій записці я виявив, що цю проблему можна обійти cd $(pwd).)


Якщо ви NFS змонтувати каталог (назвіть його adir) з хосту A на хост B, а потім виконайте видалення та відновлення для adir на хості A, ви також можете отримати помилку "Несвіжий дескриптор файлу" при доступі до adir на хості B. Використання команди touchна хості A може зробити це нормальним.
rustyhu

Відповіді:


83

Коли каталог видаляється, inode для цього каталогу (і inode для його вмісту) переробляються. Вказівник, який має ваша оболонка на inode цього каталогу (і inodes його вмісту), тепер недійсний. Коли каталог відновлюється із резервної копії, старі inode не (необов’язково) використовуються повторно; каталог та його вміст зберігаються на випадкових inode. Єдине, що залишається незмінним, - це те, що батьківський каталог повторно використовує одне і те ж ім’я для відновленого каталогу (тому що ви йому це наказали).

Тепер, якщо ви спробуєте отримати доступ до вмісту каталогу, на який все ще вказує ваша оригінальна оболонка, він передає цей запит до файлової системи як запит на оригінальний inode, який з тих пір був перероблений (і навіть може бути використаний для чогось зараз зовсім інший). Отже, ви отримуєте stale file handleповідомлення, оскільки ви просили ввести неіснуючі дані.

Коли ви виконуєте cdоперацію, оболонка переоцінює місце розташування inode будь-якого пункту призначення, яке ви їй даєте. Тепер, коли ваша оболонка знає новий inode для каталогу (і нові inodes для його вмісту), майбутні запити на його вміст будуть дійсними.


А, так це лише системний спосіб лікування недійсних / нульових покажчиків inode?
IDDQD

Так. Я не знаю достатньо деталей, щоб знати, що могло б статися, якби, наприклад, ви спробували посилатися на вже перероблений inode, щоб вказати на щось інше. Ви все-таки отримаєте застарілий дескриптор файлу? Або ви отримаєте несподівані дані?
dg99

1
Я не думаю, що система буде використовувати його повторно, оскільки хтось фактично використовує цей I-вузол, маючи його в якості поточного каталогу.
Самуель Ослунд,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.