Получение самого высокого выделенного дескриптора файла

Это может появиться в журналах, если вы используете UIWindow.rootViewController, чтобы вообще пропустить раскадровки.

Чтобы отключить сообщение журнала, вы можете удалить раскадровку, убрав ключ, связывающий раскадровку с вашим приложением, в info.plist, установите LaunchScreen.storyboard в качестве Main Interface в цели и используйте

window = UIApplication.shared.keyWindow!

внутри AppDelegate, чтобы получить основной window и присвоить ему UIViewController.

45
задан Ville Laurikari 22 May 2009 в 17:35
поделиться

3 ответа

При переносе закрытие всех файловых дескрипторов до sysconf (_SC_OPEN_MAX) ненадежно, потому что в большинстве систем этот вызов возвращает мягкое ограничение текущего файлового дескриптора, которое могло иметь был опущен ниже самого высокого используемого файлового дескриптора. Другая проблема заключается в том, что во многих системах sysconf (_SC_OPEN_MAX) может возвращать INT_MAX , что может сделать этот подход неприемлемо медленным. К сожалению, не существует надежной переносимой альтернативы, которая не включала бы перебор всех возможных неотрицательных файловых дескрипторов int.

Хотя и не переносимы, большинство операционных систем, широко используемых сегодня, предоставляют одно или несколько из следующих решений этой проблемы:

  1. Библиотечная функция для закрытия всех дескрипторов файлов > = fd . Это простейшее решение для распространенного случая закрытия всех файловых дескрипторов, хотя его нельзя использовать ни для чего другого. Чтобы закрыть все файловые дескрипторы, кроме определенного набора, можно использовать dup2 , чтобы заранее переместить их в нижний предел, а затем, если необходимо, переместить их назад.

    • closefrom (fd) ( Solaris 9 или новее, FreeBSD 7.3 или 8.0 и новее, NetBSD 3.0 или новее, OpenBSD 3.5 или новее.)

    • fcntl (fd, F_CLOSEM, 0) (AIX, IRIX, NetBSD)

  2. Библиотечная функция чтобы предоставить максимальный файловый дескриптор , используемый в данный момент процессом. Чтобы закрыть все файловые дескрипторы выше определенного числа, либо закройте их все до этого максимума, либо постоянно получайте и закрывайте самый высокий файловый дескриптор в цикле, пока не будет достигнута нижняя граница. Что более эффективно, зависит от плотности файловых дескрипторов.

    • fcntl (0, F_MAXFD) (NetBSD)

    • pstat_getproc (& ps, sizeof (struct pst_status), (size_t) 0, (int) getpid ())
      Возвращает информацию о процессе, включая самый высокий файловый дескриптор, открытый в настоящее время в ps.pst_highestfd . (HP-UX)

  3. Библиотечная функция для списка всех файловых дескрипторов , используемых в данный момент процессом. Это более гибкий подход, поскольку он позволяет закрыть все файловые дескрипторы, найти самый высокий файловый дескриптор или сделать что-нибудь еще для каждого открытого файлового дескриптора, возможно, даже для другого процесса. Пример (OpenSSH)

    • proc_pidinfo (getpid (), PROC_PIDLISTFDS, 0, fdinfo_buf, sz) (macOS)
  4. Каталог , содержащий запись для каждого дескриптора открытого файла . Это похоже на предыдущее, за исключением того, что это не библиотечная функция. Это может быть более сложным, чем другие подходы для общего использования, и может завершиться ошибкой по ряду причин, таких как не смонтированный proc / fdescfs, среда chroot или отсутствие доступных дескрипторов файлов для открытия каталога (ограничение процесса или системы). Поэтому использование этого подхода часто сочетается с резервным механизмом. Пример (OpenSSH) , другой пример (glib) .

    • / proc / pid / fd / или / proc / self / fd / (Linux, Solaris, AIX, Cygwin, NetBSD)
      (AIX не поддерживает " self ")

    • / dev / fd / (FreeBSD, macOS)

    При таком подходе может быть сложно надежно обработать все угловые случаи. Например, рассмотрим ситуацию, когда все файловые дескрипторы> = fd должны быть закрыты, но используются все файловые дескрипторы < fd , текущий предел ресурсов процесса составляет fd ], и используются файловые дескрипторы> = fd . Поскольку достигнут предел ресурсов процесса, каталог не может быть открыт. Если закрыть каждый файловый дескриптор из fd через ограничение ресурса или sysconf (_SC_OPEN_MAX) используется в качестве запасного варианта, ничего не будет закрыто.

67
ответ дан 26 November 2019 в 21:14
поделиться

Почему бы вам не закрыть все дескрипторы от 0 до, скажем, 10000.

Это будет довольно быстро, и худшее, что может случиться, - это EBADF.

-2
ответ дан 26 November 2019 в 21:14
поделиться

Способ POSIX:

int maxfd=sysconf(_SC_OPEN_MAX);
for(int fd=3; fd<maxfd; fd++)
    close(fd);

(обратите внимание, что закрытие с 3 вверх, чтобы stdin / stdout / stderr оставался открытым)

close () безвредно возвращает EBADF, если дескриптор файла не открыто. Нет необходимости тратить впустую еще одну проверку системных вызовов.

Некоторые системы Unix поддерживают closefrom (). Это позволяет избежать чрезмерного количества вызовов close () в зависимости от максимально возможного числа файловых дескрипторов. Это лучшее решение, о котором я знаю, но оно совершенно непереносимое.

14
ответ дан 26 November 2019 в 21:14
поделиться