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 echo
lub 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.
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.