Начнем с того, что вам не нужно особо заботиться о дескрипторах открытых файлов, о которых вы не знаете. Если вы знаете, что не собираетесь писать им снова, закрывать их - хорошая идея, и это не повредит - вы только что сделали fork (), в конце концов, fds открыты дважды. Но также, если вы оставите их открытыми, они вас тоже не побеспокоят - в конце концов, вы не знаете о них, вероятно, вы не будете писать им случайно.
Что касается того, что будут делать ваши сторонние библиотеки, то в любом случае это непростая задача. Некоторые, вероятно, не ожидают столкнуться с ситуацией с fork () и могут в конечном итоге случайно записать в один и тот же файл fd два процесса без какой-либо синхронизации. Другие, вероятно, не ожидают, что вы закроете их для них. Вам придется проверить. Вот почему плохой идеей является случайное открытие файлового дескриптора в библиотеке, а не передача его вызывающей стороне.
Все, что сказано, в духе ответа на первоначальный вопрос, не очень хороший способ. Вы можете вызвать dup()
или dup2()
для файлового дескриптора; если он закрыт, вызов не удастся с EBADF
. Итак, вы можете сказать:
int newfd = dup(oldfd);
if (newfd > 0)
{
close(newfd);
close(oldfd);
}
но в этот момент вы точно так же можете сказать close(oldfd)
и игнорировать все EBADF.
Предполагая, что вы все еще хотите использовать ядерную опцию закрытия всего, вам нужно найти максимальное количество возможных дескрипторов открытых файлов. Предполагая, что от 1 до 65 535 не очень хорошая идея. Прежде всего, fds начинается с 0, конечно, но также не определен конкретный верхний предел. Чтобы быть переносимым, POSIX sysconf(_SC_OPEN_MAX)
должен сказать вам, в любой здравомыслящей системе POSIX, хотя, строго говоря, это необязательно. Если вы чувствуете себя параноиком, проверьте возвращаемое значение на -1, хотя в этот момент вам, в любом случае, придется прибегнуть к жестко закодированному значению (1024 должно подойти, если вы не делаете что-то чрезвычайно странное). Или, если вы хорошо относитесь к Linux, вы можете покопаться в / proc.
Не забудьте не закрывать fds 0, 1 и 2 - это действительно может сбить с толку.