Якщо дитина роздвоєна, вона успадковує дескриптори файлів батьків, якщо дитина закриє дескриптор файлу, що буде?
Він успадковує копію дескриптора файлу. Тож закриття дескриптора у дитини закриє його для дитини, але не для батьків, і навпаки.
Якщо дитина починає писати, що трапиться з файлом наприкінці батьків? Хто керує цими невідповідностями, ядром чи користувачем?
Це точно (як у, точно буквально) те саме, що два процеси запису в один і той же файл. Ядро планує процеси самостійно, тому ви, ймовірно, отримаєте переплетені дані у файлі.
Однак POSIX (якому * nix системи в значній мірі або повністю відповідають) передбачає, що read()
і write()
функції API API (які відображаються до системних викликів) є "атомарними відносно один одного [...], коли вони працюють в звичайних файлах або символічні посилання ". GNU C також вручну обіцяє це стосовно труб (зауважте, що за замовчуванням PIPE_BUF
, що є частиною застереження, становить 64 кіБ). Це означає, що дзвінки іншими мовами / інструментами, такими як використання echo
або cat
, повинні бути включені до цього договору, тому, якщо два незалежних процесу намагаються одночасно записати "привіт" та "світ" у ту саму трубку, то вийде інша кінець або "helloworld", або "worldhello", і ніколи щось подібне "
коли функція закриття виклику процесу закриває певний відкритий файл через дескриптор файлу. Таблиця файлів декрементації процесу відліку посилається одним. Але оскільки батьки та дитина мають один і той же файл (кількість референцій становить 2, а після закриття зменшується до 1), оскільки вона не дорівнює нулю, тому процес все одно продовжує використовувати файл без проблем.
Є ДВА процеси, батько і дитина. Не існує спільного для обох "довідкових підрахунків". Вони незалежні. WRT, що відбувається, коли один із них закриває дескриптор файлів, дивіться відповідь на перше запитання.
open()
іfork()
є відмінність між файлом дескріптамі-або і в файл descipt-йоні - колишній відноситься до пізніше, і хоча дескриптори в вилці копія, вони посилаються на той самий опис. Однак при тестуванні очевидно, що це не означає, що закриття ручки дитини закриває ручку батьків. Я думаю, що це може суттєво змінити переплетення даних, коли обидві ручки пишуть - але це все-таки невизначено, так як саме це відбувається не так важливо.