Повторное использование дескрипторов файлов UNIX - PullRequest
3 голосов
/ 19 августа 2011

Хотя я разумно привык к UNIX и давно программировал на нем, я не привык к манипулированию файлами.

Я знаю, что дескрипторы файлов 0/1/2 стандартны ви ошибка.Мне известно, что всякий раз, когда процесс открывает файл, ему присваивается дескриптор с наименьшим значением, которое еще не используется - и я понимаю некоторые вещи, связанные с использованием dup / dup2.

Я запутался в файледескрипторы между процессами, хотя.Есть ли у каждого процесса свои собственные 0/1/2 дескрипторы для in / out / error или эти 3 дескриптора совместно используются всеми процессами?Почему вы можете запускать 3 программы в 3 разных оболочках, и все они получают только свои программы, если они совместно используются?

Если после запуска две программы откроют myfile.txt, будут ли они использовать дескриптор файла № 3или вторая программа будет использовать # 4, так как было взято 3?

Я знаю, что задавал один и тот же вопрос несколькими способами, но я просто хотел быть ясным.Чем больше деталей, тем лучше :) У меня никогда не было проблем с этими вещами во время программирования, но я читаю книгу UNIX, чтобы понять больше, и я внезапно понял, что это сильно смутило меня, и я никогда не думал об этом вподробно до.

Ответы [ 3 ]

5 голосов
/ 19 августа 2011

Каждый дескриптор файла является локальным для процесса.Однако некоторые файловые дескрипторы могут ссылаться на один и тот же файл - например, если вы создаете дочерний процесс, используя fork(), он будет использовать файлы, открытые родительским процессом.Он будет иметь свой собственный набор файловых дескрипторов, изначально идентичных родительским, но они могут меняться при закрытии / дублировании и т. Д.

Если две программы открывают один и тот же файл, в общем случае они получают отдельный файлдескрипторы, указывающие на отдельные внутренние структуры.Однако, используя определенные методы (fork, передача FD и т. Д.), Вы можете иметь файловые дескрипторы в разных процессах, указывающие на одну и ту же внутреннюю сущность.Как правило, однако, это не так.

Отвечая на ваш вопрос, обе программы будут иметь FD # 3 для вновь открытого файла.

3 голосов
/ 19 августа 2011

Не путайте файловые дескрипторы с ресурсами, которые они представляют. У вас может быть десять разных процессов, каждый с дескриптором файла «3», и каждый ссылается на свой открытый файл. Когда процесс выполняет ввод-вывод с использованием своего файлового дескриптора, ОС знает, какой процесс выполняет ввод-вывод, и может определить, к какому файлу относится ссылка.

3 голосов
/ 19 августа 2011

Файловые дескрипторы в Unix (обычно) сохраняются через вызовы fork () и exec (). Так что да, несколько процессов могут совместно использовать файловые дескрипторы.

Например, оболочка может выполнить команду вроде:

foo | bar

В этом случае стандартный вывод foo должен быть подключен к стандартному выводу бара. Для этого оболочка, скорее всего, будет использовать pipe () для создания файловых дескрипторов для чтения и записи. Это fork () дважды. Дескрипторы сохраняются. Форк (), который вызовет foo, закроется (1); DUP (writer_fd); сделать дескриптор writer_fd 1. Затем он выполнит exec (), и процесс foo выведет в канал, который мы создали. Для бара мы закрываем (0); DUP (считыватель); тогда exec (). И вуаля, foo выведет на бар.

...