Моя программа на C ++, работающая под Linux, запускает много дочерних процессов, и после каждого fork
чтобы запустить дочерний процесс, я закрываю все унаследованные fds, чтобы предотвратить доступ к ним детей. Теперь моя программа также наследует некоторые fds от своего родителя, и было бы гораздо разумнее просто закрыть все эти унаследованные fds при запуске программы, чем закрывать их снова и снова после каждого fork
,
Проблема в том, что я не знаю, какие fds на самом деле наследуются, а какие мои. Когда я в main()
, много кода уже запущено, и программа, возможно, уже создала некоторые из своих собственных fds (например, во время инициализации библиотек, статических объектов и т. д.). Итак, как я могу закрыть только унаследованные FDS?
Из вашего вопроса непонятно: вы просто вызываете fork () или вы вызываете execve () после fork ()?
Если execve () вызывается, флаг O_CLOEXEC должен вам помочь. Вы можете установить этот флаг для дескрипторов, которые вы не собираетесь хранить после execve (), через системный вызов fcntl () или передавая O_CLOEXEC системному вызову, который создает ваш fds.
Если вы не вызовете execve (), вы полностью унаследуете состояние родителя. Если дескриптор файла «ваш», значит, он хранится где-то в ваших структурах данных. Таким образом, вы можете перебирать эти структуры и обрабатывать дескрипторы, соответствующие вашим потребностям.
Других решений пока нет …