Нежелательные открытые сокеты в дочернем процессе - PullRequest
1 голос
/ 24 декабря 2011

У меня есть сценарий PERL, который создает много сокетов (около 700 сокетов), а затем выполняет работу с этими сокетами.После этого он использует команду system(...) для запуска другого приложения, которое открывает еще больше сокетов (например, 800 или около того), но, поскольку ограничение числа сокетов на процесс составляет 1024, я превышаю ограничение и не получаюожидаемые данные от сокета с номером 1024 и далее.

Теперь мой вопрос таков:

  1. Системная команда заставляет запущенное приложение наследовать все дескрипторы / сокеты открытого файла?
  2. Если ответ на поставленный выше вопрос - да, то есть ли другой способ запустить другое приложение, чтобы запущенное приложение не наследовало файловые дескрипторы?
  3. Если ответ на 2.нет, то есть ли способ закрыть все унаследованные файловые дескрипторы в дочернем процессе?

1 Ответ

3 голосов
/ 24 декабря 2011

Посмотрите на perlvar $ ^ F , который определяет, какие файловые дескрипторы установлены для close-on-exec. Настройка по умолчанию должна закрывать все эти дескрипторы сокетов, когда вы вызываете system (), но если нет, возможно, $ ^ F не установлен на то, что вы хотите. Очень быстрый и простой способ определить это в системе Linux - это попробовать этот вызов непосредственно перед вызовом существующей системы ():

system("ls -l /proc/self/fd");

вывод команды ls покажет вам, какие файлы оставались открытыми при выполнении команды "ls". Скорее всего, вы увидите, что открыты только stdin, stdout и stderr (дескрипторы 0, 1 и 2), но если вы увидите, что дескрипторы сокетов открыты, я бы попытался установить $ ^ F = 2 и посмотреть, поможет ли это.

...