execve () и совместное использование дескрипторов файлов

Я читал из страниц справочника execve, что, если процесс (A) называет execve, уже открытые дескрипторы файлов копируются в новый процесс (B).

Две возможности возникают здесь:-

1) Это означает, что новая таблица дескрипторов файлов создается для процесса B, записей, к которым копируются с более старой таблицы дескрипторов файлов процесса A

2) Или процесс B получает таблицу дескрипторов файлов процесса как, после того, как execve обрабатывают A, прекратит существование, и уже открытые файлы могли только быть закрыты от процесса B, если это получает таблицу дескрипторов файлов процесса A.

Какой корректен?

6
задан skaffman 5 July 2010 в 13:03
поделиться

2 ответа

Какой из них правильный?

# 2

Хотя вы спрашиваете больше о деталях реализации ОС, которые редко, если вообще когда-либо, важны для приложений, полностью прозрачны для приложений и зависят от ОС.

Обычно говорят, что новый процесс наследует файловых дескрипторов. Разумеется, кроме тех, у которых установлен флаг FD_CLOEXEC.

Даже в случае №1, если мы предположим, что в течение некоторого короткого времени оба процесса A и B находятся в памяти (не совсем, это территория fork ()), копирование таблицы fd будет нормальным. Поскольку процесс A будет завершен (с помощью exec ()), все его файловые дескрипторы будут close () d. И это не повлияет на уже скопированные файловые дескрипторы в процессе B.Файловые дескрипторы похожи на указатели на соответствующую структуру ядра, содержащую фактическую информацию о том, на что фактически указывает файловый дескриптор. Копирование таблицы fd не создает копии базовых структур - оно копирует только указатели. Структура ядра содержит счетчик ссылок (необходимый для реализации fork ()), который увеличивается при копировании и, таким образом, знает, сколько процессов его используют. Вызов метода close () для файлового дескриптора в первую очередь уменьшает счетчик ссылок. И только если счетчик становится равным нулю (больше никаких процессов не использует структуру), ОС фактически закрывает базовый файл / сокет / канал / и т. Д. (Но очевидно, что даже если внутри ядра в течение некоторого короткого времени одновременно присутствуют два процесса, приложения пользовательского пространства не могут этого увидеть, поскольку новый процесс после exec () также наследует PID исходного процесса.)

7
ответ дан 8 December 2019 в 04:51
поделиться

execve не создает новый процесс. Он заменяет программный образ вызывающего процесса, пространство памяти и т.д. на новые на основе исполняемого файла из файловой системы. Таблица файловых дескрипторов модифицируется путем закрытия всех дескрипторов с установленным флагом close-on-exec; остальные остаются открытыми и находятся в том же состоянии, в котором они были (текущая позиция, блокировки и т.д.) до execve.

Вы, вероятно, путаете это с тем, что происходит при fork, поскольку execve обычно предшествует fork. При форке процесса дочерний процесс имеет новую таблицу дескрипторов файлов, ссылающуюся на те же описания открытых файлов, что и таблица дескрипторов файлов родительского процесса.

17
ответ дан 8 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

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