Deskryptor pliku i rozwidlenie


15

Gdy dziecko jest rozwidlone, dziedziczy deskryptory plików rodziców, jeśli dziecko zamknie deskryptor pliku, co się stanie? Jeśli dziecko zacznie pisać, co stanie się z plikiem na końcu rodzica? Kto zarządza tymi niespójnościami, jądrem lub użytkownikiem?

gdy proces wywołuje closefunkcję zamykania określonego otwartego pliku za pomocą deskryptora pliku. W tabeli plików procesu liczba odwołań jest zmniejszana o jeden. Ale ponieważ rodzic i dziecko przechowują ten sam plik, liczba odwołań wynosi 2, a po zamknięciu zmniejsza się do 1. Ponieważ nie jest równa zero, proces nadal używa pliku bez problemu.

Zobacz Programowanie systemu Terrence Chan UNIX (obsługa jądra Unix dla plików).


Dobra, nieważne, że ostatni komentarz;) Na stronach dla człowieka open()i fork()istnieje różnica między plików descript-czy i w pliku descipt-ion - dawna odnosi się później, i chociaż deskryptory w widelcu są kopiami, odnoszą się do tego samego opisu. Jednak po przetestowaniu jest oczywiste, że nie oznacza to, że zamknięcie uchwytu dziecka zamyka uchwyt rodziców. Myślę, że może to subtelnie wpłynąć na przeplatanie danych, gdy oba uchwyty piszą - ale to i tak jest nieokreślone, więc to, jak to się dzieje, nie jest tak ważne.
goldilocks 17.09.13

Odpowiedzi:


29

Gdy dziecko jest rozwidlone, dziedziczy deskryptory plików rodziców, jeśli dziecko zamknie deskryptor pliku, co się stanie?

Dziedziczy kopię deskryptora pliku. Zatem zamknięcie deskryptora w dziecku spowoduje zamknięcie go dla dziecka, ale nie dla rodzica, i na odwrót.

Jeśli dziecko zacznie pisać, co stanie się z plikiem na końcu rodzica? Kto zarządza tymi niespójnościami, jądrem lub użytkownikiem?

Jest dokładnie (jak w, dosłownie) taki sam jak dwa procesy zapisujące do tego samego pliku. Jądro planuje procesy niezależnie, więc prawdopodobnie dostaniesz przeplecione dane w pliku.

Jednak POSIX (do którego systemy * nix w dużej mierze lub całkowicie się dostosowują) stanowi, że read()i write()funkcje interfejsu API C (które odwzorowują na wywołania systemowe) są „atomowe względem siebie [...], gdy działają na zwykłych plikach lub dowiązania symboliczne ”. GNU C ręcznie również obiecuje to tymczasowo w odniesieniu do potoków (zwróć uwagę, że domyślna wartość PIPE_BUF, która jest częścią warunku, to 64 kiB). Oznacza to, że wywołania w innych językach / narzędziach, takie jak użycie echolub cat, powinny być zawarte w tej umowie, więc jeśli dwa niezależne procesy spróbują napisać „cześć” i „świat” jednocześnie na tym samym potoku, co wyjdzie na drugi koniec to „helloworld” lub „worldhello”, i nigdy coś takiego jak „

gdy funkcja zamykania wywołania procesu zamyka konkretny otwarty plik za pomocą deskryptora pliku. Tabela plików procesu zmniejsza liczbę referencji o jeden, ale ponieważ zarówno rodzic, jak i dziecko przechowują ten sam plik (liczba odwołań wynosi 2, a po zamknięciu zmniejsza się na 1), ponieważ nie jest to zero, więc proces nadal korzysta z pliku bez problemu.

Istnieją dwa procesy: rodzic i dziecko. Nie ma „licznika referencji” wspólnego dla obu z nich. Są niezależni. WRT, co się dzieje, gdy jeden z nich zamyka deskryptor pliku, zobacz odpowiedź na pierwsze pytanie.


1

Ilekroć fork()tworzy nowe dziecko, deskryptory plików wcale nie są zachowywane - są zmieniane.

Chociaż plik będzie duplikatem, będzie miał inny deskryptor.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.