LINUX.ORG.RU

История изменений

Исправление tiandrey, (текущая версия) :

Ну давай по порядку.

  1. файловый дескриптор - это просто целое неотрицательное число, идентифицирующее поток ввода-вывода для процесса. Поток ввода-вывода - это в простейшем случае открытый файл, но сюда же попадают и сетевые сокеты, и пайпы.
    lsof показывает больше, чем список дескрипторов - например, он показывает области памяти, полученные в результате mmap() (работа с файлом через отображение этого файла в память и работу с памятью). У таких областей памяти в столбце FD вместо дескриптора указана строка mem.
    Там же показана текущая рабочая директория процесса (cwd), корневая директория процесса (rtd).
    У обычных дескрипторов в этой колонке пишется номер дескриптора и режим, в котором он открыт (r - read, w - write, u - read+write).
  2. дескрипторы могут быть связаны с разными типами файлов. Это отображается в столбце TYPE. Как я уже писал выше, это могут быть обычные файлы (REG, regular file), пайпы (FIFO), юниксовые сокеты (unix), сетевые сокеты (IPv4), символьные устройства (CHR, character device), и т.д. Смотри в мане полный (на самом деле нет :) ) список. В списке не описан тип a_inode. Если процесс работает с inotify, ему тоже возвращаются объекты-дескрипторы, они имеют тип a_inode (anonymous inode, вероятно).
  3. в моей бубунте vlc это динамический бинарник. Соответственно, в списке открытых файлов - все динамические библиотеки, которые нужны для его запуска; они обычно заммаплены (FD=mem).
    Дальше идут нумерованные дескрипторы, в моём случае это:
    • 3 стандартных (0, 1, 2)
    • две пары дескрипторов, связанных с одним и тем же пайпом (один на запись, другой на чтение, зачем - хз, возможно, для межпотокового взаимодействия)
    • некоторое количество юниксовых сокетов, связанных с DM и около того (pulseaudio, dbus-daemon, mate-session)
    • некоторое количество дескрипторов от inotify
    • пара символьных устройств - /dev/urandom и /dev/dri/card0 (для direct rendering, вестимо)
    • и, наконец-то, дескриптор, связанный с проигрываемым на данный момент файлом.
  4. числа в графе device - major и minor numbers - идентификаторы устройства, на котором лежит указанный файл.
  5. файловый дескриптор имеет смысл только в контексте процесса, работающего с вводом-выводом, у разных процессов одни и те же файловые дескрипторы могут быть (и будут!) связаны с разными файлами и прочими потоками ввода-вывода.

Чтобы оставить только обычные дескрипторы, используй команду lsof -a -d 0-9000 -p $(pidof vlc).

Исходная версия tiandrey, :

Ну давай по порядку.

  1. файловый дескриптор - это просто целое неотрицательное число, идентифицирующее поток ввода-вывода для процесса. Поток ввода-вывода - это в простейшем случае открытый файл, но сюда же попадают и сетевые сокеты, и пайпы.
    lsof показывает больше, чем список дескрипторов - например, он показывает области памяти, полученные в результате mmap() (работа с файлом через отображение этого файла в память и работу с памятью). У таких областей памяти в столбце FD вместо дескриптора указана строка mem.
    Там же показана текущая рабочая директория процесса (cwd), корневая директория процесса (rtd).
    У обычных дескрипторов в этой колонке пишется номер дескриптора и режим, в котором он открыт (r - read, w - write, u - read+write).
  2. дескрипторы могут быть связаны с разными типами файлов. Это отображается в столбце TYPE. Как я уже писал выше, это могут быть обычные файлы (REG, regular file), пайпы (FIFO), юниксовые сокеты (unix), сетевые сокеты (IPv4), символьные устройства (CHR, character device), и т.д. Смотри в мане полный (на самом деле нет :) ) список. В списке не описан тип a_inode. Если процесс работает с inotify, ему тоже возвращаются объекты-дескрипторы, они имеют тип a_inode (anonymous inode, вероятно).
  3. в моей бубунте vlc это динамический бинарник. Соответственно, в списке открытых файлов - все динамические библиотеки, которые нужны для его запуска; они обычно заммаплены (FD=mem).
    Дальше идут нумерованные дескрипторы, в моём случае это:
    • 3 стандартных (0, 1, 2)
    • две пары дескрипторов, связанных с одним и тем же пайпом (один на запись, другой на чтение, зачем - хз, возможно, для межпотокового взаимодействия)
    • некоторое количество юниксовых сокетов, связанных с DM и около того (pulseaudio, dbus-daemon, mate-session)
    • некоторое количество дескрипторов от inotify
    • пара символьных устройств - /dev/urandom и /dev/dri/card0
    • и, наконец-то, дескриптор, связанный с проигрываемым на данный момент файлом.
  4. числа в графе device - major и minor numbers - идентификаторы устройства, на котором лежит указанный файл.
  5. файловый дескриптор имеет смысл только в контексте процесса, работающего с вводом-выводом, у разных процессов одни и те же файловые дескрипторы могут быть (и будут!) связаны с разными файлами и прочими потоками ввода-вывода.

Чтобы оставить только обычные дескрипторы, используй команду lsof -a -d 0-9000 -p $(pidof vlc).