У меня есть процесс, который запускает openvpn в новом потоке, вызывая функцию execl ().В потоке я использую fork следующим образом.
c_pid = fork();
if (c_pid == 0) {
execl("/usr/sbin/openvpn", "--config", "/tmp/movpn-config", NULL);
} else if (c_pid > 0) {
//wait in parent for openvpn to exit
wait(&status);
} else {
printf("ERROR");
}
Openvpn запускается с сокетом управления, поэтому я могу напрямую отправить SIGTERM для остановки openvpn.В основном я запускаю и останавливаю openvpn в цикле, присоединяясь к указанному выше потоку в моей основной программе после возврата exec и повторяя ту же процедуру снова.Никаких проблем там нет.
Все это работает нормально, за исключением того, что, если я вижу детали своего процесса с помощью ps aux, я вижу, что через каждые несколько минут секция RSS увеличивается, и она связана только с вызовом execl ()..
Если я удаляю весь приведенный выше код из своего потока и заменяю его простым системным вызовом, общее поведение моей программы остается неизменным, и я больше не вижу увеличения значения RSS.
Как этот форк / execl () способствует увеличению памяти?Должен ли я выполнить дополнительную очистку, кроме команды wait ()?