Яка тривалість життя дескриптора файлу?


11

Як описано тут , перенаправлення використовуються open()для запису у файл. Існує внутрішній (?) Дескриптор файлу, створений в оболонці, а потім використовується при необхідності.

Чи створюється внутрішній дескриптор протягом усього терміну дії сценарію чи оболонки? Чи знищена вона через деякий час, ряд операцій тощо?

Я маю на увазі, зокрема, дескриптори файлів для файлів, які сама оболонка відкриває для операцій своїх вбудованих. Чи створюється дескриптор і чи відкривається файл для кожної операції? Як довго вони зберігаються? Приклад:

#!/bin/bash
>>x echo something
...do many other things not related to the file x
>>x echo something more

Чи зберігається перший екземпляр дескриптора до другої операції?

Що з оболонкою, яку я використовую в терміналі? Я інколи тримаю один сеанс відкритим протягом днів, а може, й тижнів. Чи все ще зберігаються дескриптори для всіх файлів, якими я працював із вбудованими оболонками?

Відповіді:


4

Коротко: оболонка майже напевно закриє дескриптори файлів, пов’язані з перенаправленнями, відразу після завершення команди.


Докладніше: Немає явної згадки про закриття файлів, відкритих через перенаправлення в POSIX (наскільки я бачу). Але негайно закрити їх не було б дуже корисно.

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

Для звичайних > filenameвихідних перенаправлень, файл у випадку, якщо потрібно буде скоротити при запуску кожної команди, навіть якщо дескриптор файлу був збережений. І будь-який збережений дескриптор файлу вказував би на неправильний файл, якщо відповідний файл був перейменований або видалений тим часом.

Наприклад, це не буде поводитись правильно, якщо fd, відкритий для першого, echoзалишався відкритим і використовувався як-є для другого:

echo foo >> x; mv x y; echo bar >> x

Звичайна модель fork + exec, що використовується для запуску зовнішніх програм, також дозволяє дуже легко автоматично закривати файли, коли команда закінчується. Оболонці потрібно лише fork()спочатку відкрити всі необхідні файли в дочірньому процесі, перш ніж викликати, exec()щоб замінити дитину фактичною командою. Після закінчення дочірнього процесу всі відкриті ним файли автоматично закриваються.


Вawk , хоча синтаксис для перенаправлення виводу схожий на оболонку, але будь-які відкриті файли залишаються відкритими до виходів сценарію, якщо явно не закриті. Це відкриється лише fooодин раз, і він не буде врізати його між відбитками:

awk 'BEGIN { print "a" > "foo"; print "b" > "foo" }'

6

Вони закриваються, коли закінчуються. Оболонка створить 3 дескриптора файлів 0,1,2 для кожної команди, яку вона виконує. Це просто числа, номери повторно використовуються. Оболонка закриє файли перед повторним використанням дескрипторів.

Дескриптори файлів також передаються в інші процеси. І якщо у вас процес у фоновому режимі, він все ще матиме дескриптори файлів.

У прикладі використовується 3>&1, це означає, що зробити дескриптор файлу 3 посилається на файл, на який в даний час посилається дескриптор 1.

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