Следующая идиома не редкость (это взято из части С MIMEDefang):
/* Number of file descriptors to close when forking */
#define CLOSEFDS 256
...
static void
closefiles(void)
{
int i;
for (i=0; i<CLOSEFDS; i++) {
(void) close(i);
}
}
Это что-то хак (как код MIMEDefang свободно допускает). Во многих случаях более полезно начинать с FD 3 (или STDERR_FILENO+1
) вместо 0. close()
возвращает EBADF
с недопустимым FD, но это обычно не представляет проблем (по крайней мере, не на C, на других языках может быть выбрано исключение).
Так как вы можете определить верхний предел файла дескриптора с getrlimit(RLIMIT_NOFILE,...)
который defined как:
RLIMIT_NOFILE
Это номер один больше, чем максимальное значение, которое система может назначить вновь -созданный дескриптор. Если этот предел превышен, функции, которые выделяют файловый дескриптор, должны завершиться ошибкой с установкой errno в значение [EMFILE]. Этот предел ограничивает количество файловых дескрипторов, которые может выделить процесс.
Вы можете использовать это (вычитая 1) в качестве верхнего предела цикла. Вышеуказанные и ulimit -n
, getconf OPEN_MAX
и sysconf(OPEN_MAX)
должны все согласиться.
С open()
всегда присваивает самый низкий свободный FD, максимальное количество открытых файлов и самый высокий FD + 1 - это то же самое число.
libslack daemon
utility, который использует демонические процессы, также использует этот подход (при условии, что первые три дескриптора сохраняются при использовании под inetd
).
В случае, когда ваша программа может отслеживать файловые дескрипторы, это предпочтительнее, или используйте FD_CLOEXEC
, если таковые имеются. Однако, если вы хотите защищать код, вы можете предпочесть недоверие к своему родительскому процессу, скажем, при запуске внешнего обработчика/процесса просмотра, запущенного браузером, например. как это
12
15 year old Mozilla bug на Unix.
Для параноидально (вы хотите, чтобы ваш зритель PDF наследовать каждый открытый Firefox FD, включая кэш, и открытые соединения TCP):
#!/bin/bash
# you might want to use the value of "ulimit -n" instead of picking 255
for ((fd=3; fd<=255; fd++)); do
exec {fd}<&- # close
done
exec /usr/local/bin/xpdf "[email protected]"
* "Если родительский процесс имеет 10 файловых дескрипторов, выделенных ... «*: что означает« выделение »для вас? Поскольку дескрипторы файлов открываются или закрываются. Распределение слов связано с управлением памятью ... – thkala
Исправление: я хотел сказать 10 Открытые файловые дескрипторы родительского процесса, спасибо за исправление thkala – learner