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 close
funkcję 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).
files
file-descriptors
fork
Madan Ram
źródło
źródło
open()
ifork()
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.Odpowiedzi:
Dziedziczy kopię deskryptora pliku. Zatem zamknięcie deskryptora w dziecku spowoduje zamknięcie go dla dziecka, ale nie dla rodzica, i na odwrót.
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()
iwrite()
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życieecho
lubcat
, 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 „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.
źródło
Ilekroć
fork()
tworzy nowe dziecko, deskryptory plików wcale nie są zachowywane - są zmieniane.Chociaż plik będzie duplikatem, będzie miał inny deskryptor.
źródło