Як поводяться відкриті файли в системах Linux?


17

Я просто перейменував файл журналу в "foo.log.old" і припустив, що програма почне писати новий файл журналу в "foo.log". Я здивовано виявив, що він відслідковує файл журналу до його нової назви та продовжує додавати рядки до "foo.log.old".

У Windows я не знайомий з такою поведінкою - я не знаю, чи можливо це реалізувати. Як саме така поведінка реалізована в Linux? Де я можу дізнатися більше про це?


Я не ставлю це як відповідь, тому що я насправді не знаю, але думаю, що це має відношення до того, що inode не змінюються під час переміщення файлу.
математичний

Відповіді:


20

Програми підключаються до файлів через число, що підтримується файловою системою (називається inode в традиційних файлових системах unix), на яке ім'я є лише посиланням (і, можливо, не є унікальним посиланням на це).

Отож, про що слід пам’ятати:

  1. Переміщення файлу при допомозі mvне змінює це число сошки , якщо ви праву сторону по файлової системи (що еквівалентно використання cpпотім rmна оригіналі).
  2. Оскільки до одного файлу може підключитися більше одного імені (тобто у нас є жорсткі посилання), дані у "видалених" файлах не зникають, поки всі посилання на файл, що базується, не зникнуть.
  3. Мабуть, найважливіше: коли програма із openфайлом sa посилається на нього, він посилається на нього, що (для цілей, коли дані будуть видалені) еквівалентно тому, що з ним підключено ім'я файлу.

Це породжує кілька типів поведінки, таких як:

  • Програма може openфайл для читання, але насправді не читає його до тих пір, поки користувач не rmредагує його в командному рядку, і програма все одно матиме доступ до даних .
  • Той, з яким ви стикалися: mvфайл не перериває зв’язок між файлом і будь-якими програмами, у яких він відкритий (якщо ви не переходите через межі файлової системи; у цьому випадку програма все ще має версію оригіналу для роботи).
  • Якщо програма openвідредагувала файл для запису, а користувач - rmце останнє ім'я файлу в командному рядку, програма може продовжувати вводити речі у файл, але як тільки він закриється, більше не буде посилань на ці дані та воно піде.
  • Дві програми, які спілкуються через один або декілька файлів, можуть отримати грубу часткову безпеку, видаливши файл (и) після їх закінчення open. (Це не фактичний розум безпеки, він просто перетворює зяючу дірку в перегони.)

1
Я погоджуюся з @dmckee, я просто хотів зазначити: програма може openмати файл для читання та запису (як це сталося з файлом журналу у питанні).
jsbillings

@jsbillings: Так, але є ризик. Якщо всі імена файлової системи зникли, ви можете записати ГБ у відкритий файл, який випарується, як ранкова роса, як тільки ви закриєте його.
dmckee

1
Крім того, inode копіюється в ядро, і саме цим управляється, а не копія диска. Так файл може бути mv'd або cp ', але відкритий файл вже працює зі структурами даних ядра, а не з версією диска. Отже, якщо ви скопіюєте інший файл у відкритий для запису файл, процес все одно запишеться до того ж відносного положення, що і у старому файлі. Це причина, чому такі програми, як Apache httpd, мають обробник сигналів, який закриває і знову відкриває файли журналів.
Арседж

0

Щоб дійсно побачити, як реалізується така поведінка, ви можете подивитися деякі книги програмування Unix. Матепік має рацію в тому, що він пов'язаний з індедом. Фактичне ім'я шляху використовується лише для відкриття файлу, після цього програма посилається на нього дескриптором відкритого файлу. Дескриптор файлу в свою чергу посилається на inode, що в цьому випадку не важливо, чи змінилося ім'я базових файлів.

Що стосується реалізації цього в Windows, це питання для іншого сайту.

Щоб прочитати більше про це, не потрапляючи до книг, просто знайдіть файлові системи та індекси Linux. Можливо, не буде однозначної відповіді, але ви зможете зрозуміти, чому.


4
"Шукайте навколо - ви, мабуть, не знайдете хорошої відповіді, але зрозумієте це" - це не найкраща відповідь.
mattdm
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.