Копирует ли fork ()дескриптор файла для исполняемого двоичного файла, который в данный момент выполняется вызывающим процессом?

Вероятно, вы найдете копию в /usr/share/doc/packages/SuSEfirewall2/.

Наличие «someapplication» и «someapplication.d» является частым шаблоном, где «someapplication» будет включать фрагменты конфигурации -из каталога «someapplication.d» -.

0
07.11.2020, 20:37
2 ответа

В исполняемом бинарном файле нет файлового дескриптора, только отображение памяти.

(См., например,. ls -l /proc/self/fdи cat /proc/self/mapsв Linux.)

Сопоставления памяти, конечно, будут указывать на один и тот же файл, но то же самое происходит и с разделяемыми библиотеками. В случае с основным программным файлом в Linux запись в него, когда он используется запущенным процессом, запрещена. (Хотя в последний раз, когда я проверял, это не относилось к разделяемым библиотекам.)

2
18.03.2021, 22:51

Непонятно, что вы на самом деле пытаетесь сделать, но в Linux (и некоторых других системах )вы можете получить дескриптор файла для текущего исполняемого файла с помощью open("/proc/self/exe",...). Это будет работать, даже если файл был удален или никогда не существовал в файловой системе.

Так же, как /dev/tty(, который всегда будет открывать управляющий tty вызывающего процесса --, если таковой имеется ), /proc/self/exeвсегда будет открывать файл, который в данный момент выполняется вызывающим процессом. Оба они действуют как «двери» для скрытых описаний открытых файлов, на которые уже ссылается процесс, что позволяет получить к ним доступ как к обычным файлам.

Это едва ли не единственные «скрытые»/латентные файловые дескрипторы, которые есть у процесса. В частности, вы можете создать сопоставление памяти файла с помощью mmap(..., fd,...), а затем закрытие fdНЕ удалит это сопоставление, и ваш процесс по-прежнему будет содержать ссылку на этот файл, точно так же, как дескриптор файла (и в Linux вы можете снова превратить его в файловый дескриптор, открыв/proc/self/map_files/<range>).


Другими примерами являются корневой и текущий рабочий каталог (/proc/self/{cwd,root})--, хотя, как и в случае любых каталогов, даже тех, на которые есть ссылки через open fds, их семантика отличается от семантики обычных файлов --, в частности, вы не можете создать файл внутри удаленного каталога, как вы можете продолжать записывать данные в удаленный файл через его все еще открытый файловый дескриптор.

0
18.03.2021, 22:51

Теги

Похожие вопросы