2014-02-08 3 views
1

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

Но, что еще мне нужно сделать?

Есть ли где-нибудь всеобъемлющий документ, в котором перечислены все вещи, которые вы хотите очистить при разветвлении дочернего процесса, чтобы дать ему хорошую стандартную среду исполнения?

В настоящее время я нахожусь в Linux, но мне нужен документ, который также содержит сведения о других Unix, возможно, с помощью способов autoconf-test для них.

ответ

0

fork(3) содержит comprehensive list. Коротко процитировать здесь, но в соответствии с политикой SO я все равно сделаю так:

Функция fork() должна создать новый процесс. Новый процесс (ребенок процесс) должен быть точной копией вызывающего процесса (родительский процесса), за исключением, как описано ниже:

  • дочерний процесс должен иметь уникальный идентификатор процесса.
  • Идентификатор дочернего процесса также не должен соответствовать активному идентификатору группы процессов.
  • Детский процесс должен иметь идентификатор родительского процесса, который должен быть идентификатором процесса вызывающего процесса.
  • Детский процесс должен иметь свою собственную копию дескрипторов файла родителя. Каждый из дескрипторов файла ребенка должен ссылаться на описание открытого файла с соответствующим файловым дескриптором родительского элемента.
  • Детский процесс должен иметь свою собственную копию потоков открытых каталогов родителя. Каждый поток открытых каталогов в дочернем процессе может размещение потока каталогов совместно с соответствующим каталогом поток родителя.
  • Детский процесс должен иметь свою собственную копию дескрипторов каталога сообщений родителя.
  • В значения дочернего процесса tms_utime, tms_stime, tms_cutime и tms_cstime должен быть установлен в 0.
  • время, оставшееся до сигнала будильника должен быть сброшен в ноль, а сигнал тревоги, если таковые имеются, должны быть отменены ; см. тревогу().
  • Все значения semadj должны быть очищены.
  • Файловые блокировки, установленные родительским процессом, не должны наследоваться дочерним процессом.
  • Набор сигналов, ожидающих обработки дочернего процесса, должен быть инициализирован пустым множеством.
  • Интервал таймеров должен быть сброшен в дочернем процессе.
  • Любые семафоры, открытые в родительском процессе, также должны быть открыты в дочернем процессе.
  • Детский процесс не должен наследовать блокировки памяти адресного пространства, установленные родительским процессом, путем вызова mlockall() или mlock().
  • Карты памяти, созданные в родительском объекте, сохраняются в дочернем процессе.MAP_PRIVATE-сопоставления, унаследованные от родителя, также должны быть MAP_PRIVATE отображениями в дочернем файле, и любые изменения данных в этих сопоставлениях, сделанных родителем до вызова fork(), должны быть , видимыми для ребенка. Любые изменения в данных в MAP_PRIVATE сопоставления, сделанные родителем после fork(), должны быть видны только родительскому. Модификации данных в MAP_PRIVATE сопоставлениях, сделанные ребенком, должны быть видны только для ребенка.
  • Для политик планирования SCHED_FIFO и SCHED_RR дочерний процесс должен наследовать параметры политики и приоритета родительского процесса во время функции fork(). Для других политик планирования политики и приоритеты для fork() определены в соответствии с реализацией.
  • Таймеры для каждого процесса, созданные родителем, не должны наследоваться дочерним процессом.
  • Детский процесс должен иметь свою собственную копию дескрипторов очереди сообщений родителя. Каждый из дескрипторов сообщения для дочернего элемента должен ссылаться на то же описание очереди открытых сообщений, что и на соответствующий дескриптор сообщения родительского элемента .
  • Никакие асинхронные операции ввода или асинхронного вывода не должны быть унаследованы дочерним процессом.
  • Процесс должен быть создан одним потоком. Если многопоточный процесс вызывает fork(), новый процесс должен содержать реплику вызывающего потока и всего его адресного пространства, возможно, включая состояния мьютексов и других ресурсов . Следовательно, во избежание ошибок дочерний процесс может выполнять только операции с безопасностью асинхронного сигнала до , как только вызывается одна из функций exec. Обработчики вил могут быть , установленными с помощью функции pthread_atfork(), чтобы поддерживать инварианты приложений для вызовов fork(). Когда приложение вызывает fork() из обработчика сигнала, и любой обработчик fork , зарегистрированный pthread_atfork(), вызывает функцию, которая не является asynch-signal-safe, поведение не определено.
  • Если поддерживаются опция Trace Inherit и Trace Inherit: если вызывающий процесс отслеживается в потоке трассировки, который имеет свою политику наследования , установленную в POSIX_TRACE_INHERITED, дочерний процесс должен быть прослежен в этот поток трассировки и дочерний процесс должен унаследовать сопоставление родительских имен событий трассировки с типом события трассировки . Если поток трассировки, в котором вызывающий процесс был отслеживается , имел свою политику наследования, установленную в POSIX_TRACE_CLOSE_FOR_CHILD, дочерний процесс не должен быть прослежен в этот поток трассировки. Политика наследования устанавливается вызовом функции posix_trace_attr_setinherited() .
  • Если параметр Trace поддерживается, но опция Trace Inherit не поддерживается: дочерний процесс не должен быть прослежен ни в одном из потоков трассировки его родительского процесса.
  • Если поддерживается функция трассировки, дочерний процесс процесса контроллера трассировки не должен контролировать потоки трассировки, контролируемые его родительским процессом.
  • Начальное значение часов CPU-времени дочернего процесса должно быть установлено равным нулю.
  • Начальное значение времени CPU-времени для одного потока дочернего процесса должно быть равно нулю. Все остальные характеристики процесса , определенные IEEE Std 1003.1-2001, должны быть одинаковыми в родительском и дочерних процессах.Наследование характеристик процесса не , определенное IEEE Std 1003.1-2001, не определено IEEE Std 1003.1-2001.
+0

Это все, о чем я ** не беспокоюсь. Например, он ничего не говорит о сигнальной маске, потому что сигнальная маска - это то, что вам нужно, чтобы очистить себя. Я ищу список вещей, которые ни fork(), ни exec() не заботятся о вас. – dataless

+0

Хм, ты отчасти прав. Он упоминает файловые дескрипторы, потоки каталогов и дескрипторы очереди сообщений как потенциальные проблемы, о которых можно беспокоиться. – Thomas