Kiedy usuwasz plik, tak naprawdę usuwasz link do pliku (do i-węzła). Jeśli ktoś już ma ten plik otwarty, może zachować deskryptor pliku, który ma. Plik pozostaje na dysku, zajmuje miejsce i można go zapisać i odczytać, jeśli masz do niego dostęp.
unlink
Funkcja jest zdefiniowana z tego zachowania przez POSIX:
Gdy liczba linków do pliku osiągnie wartość 0 i żaden proces nie otworzy pliku, przestrzeń zajmowana przez plik zostanie zwolniona, a plik nie będzie już dostępny. Jeśli jeden lub więcej procesów ma otwarty plik po usunięciu ostatniego linku, link zostanie usunięty przed powrotem unlink (), ale usunięcie zawartości pliku zostanie odroczone do momentu zamknięcia wszystkich odniesień do pliku .
Ta rada z powodu tego zachowania. Demon otworzy plik i nie zauważy, że został usunięty (chyba że monitorował go konkretnie, co jest rzadkie). Będzie beztrosko zapisywać do istniejącego deskryptora pliku, który ma: będziesz nadal zajmować (więcej) miejsca na dysku, ale nie będziesz w stanie zobaczyć żadnej wiadomości, którą pisze, więc naprawdę jesteś w najgorszym obu światów. Jeśli zamiast tego skrócisz plik do zera, miejsce zostanie natychmiast zwolnione, a wszelkie nowe wiadomości zostaną dołączone na nowym końcu pliku, gdzie możesz je zobaczyć.
Ostatecznie, gdy demon zakończy działanie lub close
s plik , przestrzeń zostanie zwolniona. Nikt nowy nie może otworzyć pliku w międzyczasie (inaczej niż poprzez specyficzne dla systemu interfejsy odblaskowe, takie jak Linux/proc/x/fd/...
). Gwarantuje to również, że:
Jeśli liczba odsyłaczy pliku wynosi 0, gdy wszystkie deskryptory pliku skojarzone z plikiem zostaną zamknięte, przestrzeń zajmowana przez plik zostanie zwolniona, a plik nie będzie już dostępny.
Dzięki temu nie tracisz na stałe miejsca na dysku, ale nic nie zyskujesz poprzez usunięcie pliku i tracisz dostęp do nowych wiadomości.
/proc/x/fd/y
? Czy spowodowałoby to, że proces nie zapisuje się do deskryptora pliku, czy jest to nielegalna operacja?