дескриптор файла по сравнению с именем файла

time встроенная из Вашей оболочки. Если Вам нравится time но нуждаюсь в большей информации, пробую GNU time в подробном (-v) режим:

/usr/bin/time -v sleep 5               
    Command being timed: "sleep 5"
    User time (seconds): 0.00
    System time (seconds): 0.00
    Percent of CPU this job got: 0%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:05.00
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 2144
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 179
    Voluntary context switches: 2
    Involuntary context switches: 1
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0

Ищите пакет "время" или "gnutime" в Вашем диспетчере пакетов.

12
08.08.2011, 14:30
2 ответа

Все четыре из /dev/fd/0, /dev/stdin, /proc/self/fd/0 и /dev/pts/2 имена файлов, как /////dev/../dev/fd//0, /bin/sh, /etc/fstab, /fioejfoeijf, и т.д. Все кроме того последнего примера, вероятно, будут названием существующего файла на Вашей машине. Имя файла является строкой, которая может определять файл в Вашей файловой системе; в соответствии с Linux, любая строка, которая не содержит пустой байт и это самое большее 4 096 байтов длиной, является именем правильного файла. Многие из этих имен эквивалентны, например. /bin/sh эквивалентно ///bin/sh, /bin/../bin/sh (принятие /bin существующий каталог), и т.д. Всеми примерами, которые я дал до сих пор, являются абсолютные имена файлов; существуют также имена файла прямого доступа, которые не начинаются с a / и чье значение зависит от текущего каталога.

Терминология, окружающая имена файлов, не универсальна; иногда “имя файла” значит полный путь для файла, и иногда это означает название записи каталога. Терминология POSIX является “именем файла” или “компонентом пути” для названия записи каталога и “пути” для полного пути.

Дескриптор файла определяет открытый файл в конкретном процессе. Ядро поддерживает таблицу дескрипторов файлов для каждого процесса. Каждая запись в таблице дескрипторов файлов указывает, что сделать, если процесс запрашивает чтение, запись и другие операции на дескрипторе файла.

Дескрипторы файлов могут соответствовать файлу и иметь связанное имя, но не все они делают. Для тех, которые делают, файл может быть регулярным файлом, каталогом, файлом устройств или именованным каналом (также названный FIFO) (вид, созданный mkfifo); некоторые системы имеют дальнейшие возможности, такие как сокеты Unix и двери. Примеры дескрипторов файлов, которые не имеют связанного именованного файла, включают каналы (вид, созданный pipe) и сети сокетов.

/dev/fd/0, /dev/stdin и /proc/self/fd/0 имена файлов (весь эквивалент) со специфическим значением: они все определяют, какой бы ни к файлу в настоящее время получают доступ через дескриптор файла 0. Когда процесс открывает их, ядро копирует запись с индексом 0 в таблице дескрипторов дескриптора файла к новому дескриптору. Открытие любого из этих файлов эквивалентно вызову dup(0). Именованные файлы являются способом косвенно заставить процесс использовать один из своих уже открытых файлов, а не открывать новый файл; они главным образом полезны для передачи командной строки программы, где программа ожидает, что название файла откроется.

12
27.01.2020, 19:55
  • 1
    @Giles, который Вы записали "Каждой записи в таблице дескрипторов файлов, указывает, что сделать, если процесс запрашивает чтение, запись и другие операции на дескрипторе файла". (шахта акцента). Насколько я понял, что это - просто целое число как стандартные 0,1,2 и т.д. для stdin, stdout и stderr соответственно. Это были бы более высокие ценные числа для регулярных файлов. То, что я не получаю из Вашего комментария, - то, как это число указывает, "что сделать, если процесс запрашивает чтение, запись и другие операции на дескрипторе файла".. Можно ли подробно остановиться на этом немного? –  Geek 27.07.2014, 12:14
  • 2
    @Geek запись в таблице дескрипторов файлов не является числом. Число является индексом в ту таблицу. –  Gilles 'SO- stop being evil' 28.07.2014, 01:42
  • 3
    @Giles благодарит за разъяснение моего недоразумения. Я понимаю это лучше теперь. Так можете Вы давать пример, "что" внести свой вклад в Вашем ответе. Я заключил, что каждая запись в таблице дескрипторов файлов снова имеет указатель на таблицу файлов, которая содержит информацию как файловое смещение, состояние файла и т.д., Но я все еще не ясен на, "что" внести свой вклад в Вашем ответе. спасибо –  Geek 28.07.2014, 07:48

Имя файла является просто названием файла в файловой системе, ничем более - это - просто строка.

Дескриптор файла является некоторым объектом, от того, где можно читать и/или записать. Это открыто и готовый файл. Нет только дескрипторов файлов - stdin, stdout, и stderr являются также дескрипторами, можно записать и читать от них использующий абсолютно те же функции в качестве с файлами (кроме Вас, не может, например, искать). Другие примеры дескрипторов, которые не являются файлами: именованные каналы и сетевые сокеты.

В коде дескриптор файла является переменной, указателем на что-то в ядре, которое представляет объект файла.

Например,/dev/fd/0,/dev/stdin,/proc/self/fd/0 являются всеми ссылками на/dev/pts/2. Эти четыре дескрипторов файлов, или имена файлов?

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

2
27.01.2020, 19:55

Теги

Похожие вопросы