- М-р Wizard -
Многие системные вызовы, такие, как open()
, read()
и write()
, предназначены для вызова непосредственно из кода пользователя: другими словами, из кода, который пишете вы как разработчик GNU/Linux.
Однако, другие системные вызовы существуют лишь для того, чтобы дать возможность реализовать стандартные библиотечные функции более высокого уровня, и никогда не должны вызываться непосредственно. Одним из таких системных вызовов является GNU/Linux getdents()
; он читает несколько элементов каталога в буфер, предоставленный вызывающим — в данном случае, кодом реализации readdir()
. Затем код readdir()
возвращает действительные элементы каталога, по одному за раз, пополняя при необходимости буфер.
Эти системные вызовы только-для-библиотечного-использования можно отличить от вызовов для-использования-пользователем по их представлению в странице справки. Например, из
ИМЯ
getdents - получить элементы каталога
ОПИСАНИЕ
#include
#include
#include
#include
_syscall3(int, getdents, uint, fd, struct dirent*,
dirp, uint, count);
int getdents(unsigned int fd, struct dirent *dirp,
unsigned int count);
Любой системный вызов, использующий макрос _syscallX()
, не должен вызываться кодом приложения. (Дополнительную информацию об этих вызовах можно найти в справочной странице для
В случае getdents()
на многих других системах Unix есть сходный системный вызов; иногда с тем же именем, иногда с другим. Поэтому попытка использования этих вызовов привела бы в любом случае лишь к большому беспорядку с переносимостью; гораздо лучше во всех случаях использовать readdir()
, интерфейс которого хорошо определен, стандартизован и переносим.
5.3.1.2. Элементы каталогов Linux и BSD
Хотя мы только что сказали, что вам следует использовать лишь члены d_ino
и d_name
структуры struct dirent
, стоит знать о члене d_type
в struct dirent
BSD и Linux. Это значение unsigned char
, в котором хранится тип файла, имя которого находится в элементе каталога:
struct dirent {
...
ino_t d_ino; /* Как ранее */
char d_name[...]; /* Как ранее */
unsigned char d_type; /* Linux и современная BSD */
...
};
d_type
может принимать любые значения, описанные в табл. 5.1.
Таблица 5.1. Значения для d_type
Имя | Значение |
---|---|
DT_BLK | Файл блочного устройства |
DT_CHR | Файл символьного устройства |
DT_DIR | Каталог |
DT_FIFO | FIFO или именованный канал |
DT_LNK | Символическая ссылка |
DT_REG | Обычный файл |
DT_SOCK | Сокет |
DT_UNKNOWN | Неизвестный тип файла |
DT_WHT | Нет элемента (только системы BSD) |