Jak zachowują się otwarte pliki w systemach Linux?

17

Właśnie zmieniłem nazwę pliku dziennika na „foo.log.old” i założyłem, że aplikacja zacznie pisać nowy plik dziennika w „foo.log”. Byłem zaskoczony, gdy odkryłem, że śledził plik dziennika do nowej nazwy i dodawał wiersze do „foo.log.old”.

W systemie Windows nie znam tego rodzaju zachowania - nie wiem, czy jest możliwe jego wdrożenie. Jak dokładnie to zachowanie jest implementowane w systemie Linux? Gdzie mogę dowiedzieć się więcej na ten temat?

ripper234
źródło
Nie stawiam tego jako odpowiedzi, ponieważ tak naprawdę nie wiem, ale myślę, że ma to związek z tym, że i-węzły nie są zmieniane podczas przenoszenia pliku.
mathepic

Odpowiedzi:

20

Programy łączą się z plikami za pośrednictwem numeru obsługiwanego przez system plików (nazywany i-węzłem w tradycyjnych systemach plików Unix), do którego nazwa jest tylko odniesieniem (i być może nie jest to unikalne odniesienie).

Jest więc kilka rzeczy, o których należy pamiętać:

  1. Przenoszenie plików za pomocą mvnie zmienia tego numeru podwładnego chyba przenieść ją przez systemy plików (co jest równoważne użyciu cpnastępnie rmna oryginale).
  2. Ponieważ więcej niż jedna nazwa może połączyć się z jednym plikiem (tzn. Mamy twarde linki), dane w „usuniętych” plikach nie znikają, dopóki wszystkie odniesienia do pliku podstawowego nie znikną.
  3. Być może najważniejsze: gdy program openzapisuje plik, zawiera odniesienie do niego, które jest (na potrzeby, kiedy dane zostaną usunięte) równoważne z połączeniem z nim nazwy pliku.

To powoduje kilka zachowań, takich jak:

  • Program może openodczytać plik, ale nie może go odczytać, dopóki użytkownik nie zmodyfikuje rmgo w wierszu polecenia, a program nadal będzie miał dostęp do danych .
  • Ten, z którym się spotkałeś: mving plik nie rozłącza relacji między plikiem a jakimikolwiek programami, które go otwierają (chyba że przekraczasz granice systemu plików, w którym to przypadku program nadal ma wersję oryginału do pracy).
  • Jeśli program openedytuje plik do zapisania, a rmjego ostatnia nazwa użytkownika w wierszu poleceń, może kontynuować wprowadzanie plików do pliku, ale gdy tylko się zamknie, nie będzie już żadnych odniesień do tych danych i zniknie.
  • Dwa programy komunikujące się przez jeden lub więcej plików mogą uzyskać surowe, częściowe bezpieczeństwo poprzez usunięcie plików po ich zakończeniu open. (To nie jest rzeczywisty umysł bezpieczeństwa, po prostu przekształca otwartą dziurę w wyścig.)
dmckee
źródło
1
Zgadzam się z @dmckee, chciałem tylko zauważyć: program może openplik do odczytu i zapisu (tak jak stało się z plikiem dziennika w pytaniu).
jsbillings
@jsbillings: Tak, ale istnieje ryzyko. Jeśli wszystkie nazwy systemu plików znikną, możesz zapisać GB do otwartego pliku, który wyparuje jak poranna rosa, jak tylko go zamkniesz.
dmckee,
1
Ponadto, i-węzeł jest kopiowany do jądra i to na nim działa, a nie kopia dysku. Tak więc plik może mieć format mv'd lub cp ', ale otwarty plik już działa ze strukturami danych jądra, a nie wersją dysku. Jeśli więc skopiujesz kolejny plik do pliku, który jest otwarty do zapisu, proces nadal będzie zapisywać w tej samej względnej pozycji, co w starym pliku. To jest powód, dla którego programy, takie jak Apache httpd, mają moduł obsługi sygnału, który zamyka i ponownie otwiera pliki dziennika.
Arcege
0

Aby naprawdę zobaczyć, jak to zachowanie jest implementowane, możesz spojrzeć na niektóre książki o programowaniu w Uniksie. Mathepic ma rację, ponieważ jest powiązany z i-węzłem. Rzeczywista nazwa ścieżki jest używana tylko do otwarcia pliku, gdy to zrobisz, program odwoła się do niego przez otwarty deskryptor pliku. Deskryptor pliku z kolei odwołuje się do i-węzła, który w tym przypadku nie obchodzi, czy nazwa plików źródłowych uległa zmianie.

Jeśli chodzi o implementację tego w systemie Windows, jest to pytanie do innej witryny.

Aby przeczytać więcej na ten temat, nie zaglądając do książek, wystarczy poszukać systemów plików i i-węzłów systemu Linux. Być może nie będzie jednoznacznej odpowiedzi, ale zrozumiesz dlaczego.

Pan Shickadance
źródło
4
„Szukaj w okolicy - prawdopodobnie nie znajdziesz dobrej odpowiedzi, ale ją zrozumiesz” nie jest dobrą odpowiedzią.
mattdm,