Моя программа выполняет следующие действия в хронологическом порядкеDUP(), а затем Close() из нескольких потоков или процессов
- программа запускается с корневыми разрешениями.
- Среди других задач файл, доступный только для чтения с правами root, -
open()
ред. - Коренные привилегии отбрасываются.
- Процессы детей порождаются
clone()
и установлены флагиCLONE_FILES | CLONE_FS | CLONE_IO
, а это означает, что, хотя они используют отдельные области виртуальной памяти, они имеют одну и ту же таблицу дескрипторов файлов (и другие элементы ввода-вывода). - Все дочерние процессы
execve()
их собственные программы (флагFD_CLOEXEC
не используется). - Оригинальная программа завершается.
Теперь я хочу, чтобы каждая запрограммированная программа считывала содержимое вышеупомянутого файла, но после того, как все они прочитали файл, я хочу, чтобы он был закрыт (по соображениям безопасности).
Одно из возможных решений, которое я рассматриваю сейчас, имеет шаг 3a, где fd файла - dup()
, выделенный один раз для каждого дочернего процесса, и каждый ребенок получает свой собственный fd (как argv
). Тогда каждая дочерняя программа просто close()
их fd, так что после того, как все fds, указывающие на файл, будут close()
d «фактический файл» закрыт.
Но так ли это работает? И безопасно ли это сделать (т. Е. Файл действительно закрыт)? Если нет, есть ли другой/лучший метод?
Если оба родителя и дети все закрывают их fd, файл закрывается. Есть ли причина использовать «клон»? Я думаю, что простая «вилка» будет демонстрировать такое же поведение. –
'Если оба родителя и дети все закрывают свой fd, тогда файл закрывается.« Это была бы хорошая новость, спасибо. 'Есть ли причина использовать клон? Я думаю, что простая вилка будет демонстрировать очень то же поведение. «Правда, но причина, по которой я использую« clone() », связана с производительностью: все дочерние программы должны обрабатывать один и тот же действительно большой набор сокетов (через« epoll ») , Совместное использование таблицы fd позволяет избежать излишних издержек. Причина, по которой я упоминаю, что в вопросе, заключается в том, что я не на 100%, что эта деталь не имеет значения. – Will
Можно ли читать (/ разбирать) файл в родительском процессе и сохранять результат в памяти, разделяемой с помощью 'mmap', как шаг 3a? Это пропустит проблему передачи fd дочерним процессам и будет следовать принципу отказа от привилегий как можно скорее. –