Похоже, что 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
/proc/$(PID)/fd
и уточнить сls -la
, какие открытые файлы fds. - person schorsch_76   schedule 02.09.2019