Посмотрите на perlvar $ ^ F , который определяет, какие файловые дескрипторы установлены для close-on-exec. Настройка по умолчанию должна закрывать все эти дескрипторы сокетов, когда вы вызываете system (), но если нет, возможно, $ ^ F не установлен на то, что вы хотите. Очень быстрый и простой способ определить это в системе Linux - это попробовать этот вызов непосредственно перед вызовом существующей системы ():
system("ls -l /proc/self/fd");
вывод команды ls покажет вам, какие файлы оставались открытыми при выполнении команды "ls". Скорее всего, вы увидите, что открыты только stdin, stdout и stderr (дескрипторы 0, 1 и 2), но если вы увидите, что дескрипторы сокетов открыты, я бы попытался установить $ ^ F = 2 и посмотреть, поможет ли это.