Закройте все унаследованные fds при запуске программы

Моя программа на C ++, работающая под Linux, запускает много дочерних процессов, и после каждого fork чтобы запустить дочерний процесс, я закрываю все унаследованные fds, чтобы предотвратить доступ к ним детей. Теперь моя программа также наследует некоторые fds от своего родителя, и было бы гораздо разумнее просто закрыть все эти унаследованные fds при запуске программы, чем закрывать их снова и снова после каждого fork,

Проблема в том, что я не знаю, какие fds на самом деле наследуются, а какие мои. Когда я в main(), много кода уже запущено, и программа, возможно, уже создала некоторые из своих собственных fds (например, во время инициализации библиотек, статических объектов и т. д.). Итак, как я могу закрыть только унаследованные FDS?

0

Решение

  1. Из вашего вопроса непонятно: вы просто вызываете fork () или вы вызываете execve () после fork ()?
    Если execve () вызывается, флаг O_CLOEXEC должен вам помочь. Вы можете установить этот флаг для дескрипторов, которые вы не собираетесь хранить после execve (), через системный вызов fcntl () или передавая O_CLOEXEC системному вызову, который создает ваш fds.

  2. Если вы не вызовете execve (), вы полностью унаследуете состояние родителя. Если дескриптор файла «ваш», значит, он хранится где-то в ваших структурах данных. Таким образом, вы можете перебирать эти структуры и обрабатывать дескрипторы, соответствующие вашим потребностям.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector