Я нашел достойное решение, используя Xephyr и VirtualGL !
Установите Xephyr и VirtualGL , затем запустите Xephyr с вашими предпочтительными настройками:
Xephyr -screen 1024x768 :1
Если все прошло хорошо, теперь вы сможете запускать исполняемые файлы с ускорением OpenGL в Xephyr!
DISPLAY=:1 vglrun -- glxgears
tl;dr ls -U /proc/PID/fd | wc -l
сообщит вам число, которое должно быть меньше ulimit -n
.
/proc/PID/fd
должен содержать все дескрипторы файлов, открытые процессом, включая, помимо прочего, странные, такие как дескрипторы epoll
или inotify
, «непрозрачные» дескрипторы каталогов, открытые с помощью O_PATH
, дескрипторы, открытые с помощью signalfd()
или memfd_create()
, сокеты, возвращаемые accept()
, и т. д.
Я не слишком хорошо lsof
пользуюсь, но lsof
тоже получает информацию от /proc
. Я не думаю, что есть другой способ получить список файловых дескрипторов, открытых процессом в Linux, кроме procfs
или путем присоединения к процессу с помощью ptrace
.
В любом случае, текущая и корневая директория, mmapped-файлы (, включая собственные бинарные и динамические библиотеки )и управление терминалом процесса, не учитываются в лимите, установленном с помощью ulimit -n
(RLIMIT_NOFILE
), и они также не учитываются. появляются в /proc/PID/fd
, если только процесс явно не держит их открытыми дескрипторами.