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?
files
open-files
rename
ripper234
źródło
źródło
Odpowiedzi:
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ć:
mv
nie zmienia tego numeru podwładnego chyba przenieść ją przez systemy plików (co jest równoważne użyciucp
następnierm
na oryginale).open
zapisuje 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:
open
odczytać plik, ale nie może go odczytać, dopóki użytkownik nie zmodyfikujerm
go w wierszu polecenia, a program nadal będzie miał dostęp do danych .mv
ing 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).open
edytuje plik do zapisania, arm
jego 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.open
. (To nie jest rzeczywisty umysł bezpieczeństwa, po prostu przekształca otwartą dziurę w wyścig.)źródło
open
plik do odczytu i zapisu (tak jak stało się z plikiem dziennika w pytaniu).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.
źródło