boost :: process system утечка файловых дескрипторов

Похоже, что boost :: process :: system пропускает fds:

Скажем, у меня есть этот простой код для сброса конфигурации iptables каждые 3 секунды (просто пример):

#include <boost/process.hpp>
#include <thread>


int main(void)
{
  while(true)
  {
    std::this_thread::sleep_for(std::chrono::seconds(3));
    boost::process::system(boost::process::search_path("iptables"), "-F");
  }
  return 0;
}

Если я наблюдаю количество открытых файловых дескрипторов, перечисляя /proc/PID/fd |wc -l, я вижу, что это количество увеличивается на единицу каждые 3 секунды. В конце концов, когда он достигнет 1024, программа будет прервана, потому что вызов system вызовет исключение с what() о том, что слишком много открытых файлов!

Как я могу избежать этой утечки файлового диска? Пользуюсь бустом 1.69.

РЕДАКТИРОВАТЬ: Замена boost::process::system на boost::process::child, похоже, не помогает, child, похоже, также пропускает fds, независимо от того, отсоединяется он или нет.

РЕДАКТИРОВАТЬ 2: журнал Valgrind с --track-fds=yes: https://termbin.com/d6ud


person Jussi Hietanen    schedule 02.09.2019    source источник
comment
Я выполняю код на своей машине (fedora25) и не вижу утечки файловых дескрипторов, как вы упомянули. Вы запускаете программу с правами root? какую ОС вы используете?   -  person camp0    schedule 02.09.2019
comment
@ camp0, интересно! Я запускаю его в Arch Linux с ядром 5.2.4. Да, я запускаю программу с правами root. Ваша версия буста соответствует моей?   -  person Jussi Hietanen    schedule 02.09.2019
comment
Я запускаю 1.66 и g ++ 8.3.1, вы пробовали запускать напрямую / usr / bin / iptables? должно быть легко определить, где проблема в вашем коде.   -  person camp0    schedule 02.09.2019
comment
Так что я использую 1.69 и 9.1.0 соответственно. Использование / usr / bin / iptables приводит к тому же поведению; Это все еще утечка файловые системы. Чтобы уточнить, команда iptables выполняется успешно (брандмауэр сбрасывается). По какой-то причине он просто все еще пропускает fd.   -  person Jussi Hietanen    schedule 02.09.2019
comment
Единственное, что приходит мне в голову, - это проверить процесс и посмотреть, что это за файловые дескрипторы, чтобы определить проблему.   -  person camp0    schedule 02.09.2019
comment
Очень хорошая идея. Я запустил его в valgrind и связал пасту с исходным постом.   -  person Jussi Hietanen    schedule 02.09.2019
comment
Вы также можете посетить /proc/$(PID)/fd и уточнить с ls -la, какие открытые файлы fds.   -  person schorsch_76    schedule 02.09.2019
comment
@ schorsch_76, вроде это ошибка самой библиотеки. Я отвечу и закрою этот.   -  person Jussi Hietanen    schedule 02.09.2019


Ответы (1)


Проблема, похоже, связана с ошибкой в ​​конкретной версии (1.69) boost, а не в самом опубликованном коде. Таким образом, обновление Boost / исправление ошибки решает эту проблему.

Отчет об ошибке можно найти здесь: https://github.com/boostorg/process/issues/62

person Jussi Hietanen    schedule 02.09.2019