Дескриптор файлу та виделка


15

Якщо дитина роздвоєна, вона успадковує дескриптори файлів батьків, якщо дитина закриє дескриптор файлу, що буде? Якщо дитина починає писати, що трапиться з файлом наприкінці батьків? Хто керує цими невідповідностями, ядром чи користувачем?

коли процес викликає closeфункцію закриття певного відкритого файлу через дескриптор файлу. У таблиці файлів процесу кількість посилань зменшується на одиницю. Але оскільки батьки та дочі мають один і той же файл, кількість посилань дорівнює 2, а після закриття зменшується до 1. Оскільки він не дорівнює нулю, процес все ще продовжує використовувати файл без проблем.

Див. Системне програмування Terrence Chan UNIX, (Підтримка ядра Unix для файлів).


Добре, не заперечує , що останній коментар;) в людині сторінках open()і fork()є відмінність між файлом дескріптамі-або і в файл descipt-йоні - колишній відноситься до пізніше, і хоча дескриптори в вилці копія, вони посилаються на той самий опис. Однак при тестуванні очевидно, що це не означає, що закриття ручки дитини закриває ручку батьків. Я думаю, що це може суттєво змінити переплетення даних, коли обидві ручки пишуть - але це все-таки невизначено, так як саме це відбувається не так важливо.
goldilocks

Відповіді:


29

Якщо дитина роздвоєна, вона успадковує дескриптори файлів батьків, якщо дитина закриє дескриптор файлу, що буде?

Він успадковує копію дескриптора файлу. Тож закриття дескриптора у дитини закриє його для дитини, але не для батьків, і навпаки.

Якщо дитина починає писати, що трапиться з файлом наприкінці батьків? Хто керує цими невідповідностями, ядром чи користувачем?

Це точно (як у, точно буквально) те саме, що два процеси запису в один і той же файл. Ядро планує процеси самостійно, тому ви, ймовірно, отримаєте переплетені дані у файлі.

Однак POSIX (якому * nix системи в значній мірі або повністю відповідають) передбачає, що read()і write()функції API API (які відображаються до системних викликів) є "атомарними відносно один одного [...], коли вони працюють в звичайних файлах або символічні посилання ". GNU C також вручну обіцяє це стосовно труб (зауважте, що за замовчуванням PIPE_BUF, що є частиною застереження, становить 64 кіБ). Це означає, що дзвінки іншими мовами / інструментами, такими як використання echoабо cat, повинні бути включені до цього договору, тому, якщо два незалежних процесу намагаються одночасно записати "привіт" та "світ" у ту саму трубку, то вийде інша кінець або "helloworld", або "worldhello", і ніколи щось подібне "

коли функція закриття виклику процесу закриває певний відкритий файл через дескриптор файлу. Таблиця файлів декрементації процесу відліку посилається одним. Але оскільки батьки та дитина мають один і той же файл (кількість референцій становить 2, а після закриття зменшується до 1), оскільки вона не дорівнює нулю, тому процес все одно продовжує використовувати файл без проблем.

Є ДВА процеси, батько і дитина. Не існує спільного для обох "довідкових підрахунків". Вони незалежні. WRT, що відбувається, коли один із них закриває дескриптор файлів, дивіться відповідь на перше запитання.


1

Щоразу, коли fork()робить нову дитину, дескриптори файлів взагалі не зберігаються - вони змінюються.

Хоча файл буде дублікатом, він буде мати інший дескриптор файлу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.