Linux программирование в примерах
Linux программирование в примерах читать книгу онлайн
В книге рассмотрены вопросы, связанные с программированием под Linux: файловый ввод/вывод, метаданные файлов, основы управления памятью, процессы и сигналы, пользователи и группы, вопросы интернационализации и локализации, сортировка, поиск и многие другие. Много внимания уделено средствам отладки, доступным под GNU Linux. Все темы иллюстрируются примерами кода, взятого из V7 UNIX и GNU. Эта книга может быть полезна любому, кто интересуется программированием под Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
5.3.1.2. Элементы каталогов Linux и BSD
Хотя мы только что сказали, что вам следует использовать лишь члены
d_ino
d_name
struct dirent
d_type
struct dirent
unsigned char
struct dirent {
...
ino_t d_ino; /* Как ранее */
char d_name[...]; /* Как ранее */
unsigned char d_type; /* Linux и современная BSD */
...
};
d_type
Таблица 5.1. Значения для
d_type
Имя | Значение |
---|---|
DT_BLK | Файл блочного устройства |
DT_CHR | Файл символьного устройства |
DT_DIR | Каталог |
DT_FIFO | FIFO или именованный канал |
DT_LNK | Символическая ссылка |
DT_REG | Обычный файл |
DT_SOCK | Сокет |
DT_UNKNOWN | Неизвестный тип файла |
DT_WHT | Нет элемента (только системы BSD) |
Знание типа файла просто путем чтения элемента каталога очень удобно; это может сэкономить на возможно дорогом системном вызове
stat()
stat()
5.3.2. Функции размещения каталогов BSD
Иногда полезно отметить текущее положение в каталоге для того, чтобы иметь возможность позже к нему вернуться. Например, вы пишете код, обходящий дерево каталога, и хотите рекурсивно входить в каждый подкаталог, когда его проходите. (Как отличить файлы от каталогов обсуждается в следующем разделе). По этой причине первоначальный интерфейс BSD включал две дополнительные процедуры:
#include <dirent.h> /* XSI */
/* Предупреждение: POSIX XSI использует для обеих функций long, а не off_t */
off_t telldir(DIR *dir); /* Вернуть текущее положение */
void seekdir(DIR *dir, off_t offset); /* Переместиться в данное положение */
Эти процедуры подобны функциям
ftell()
fseek()
<stdio.h>
Эти процедуры включены в часть XSI стандарта POSIX, поскольку они имеют смысл лишь для каталогов, которые реализованы с линейным хранением элементов каталога
Помимо предположений, сделанных относительно лежащей в основе структуры каталога, эти процедуры рискованнее использовать, чем простые процедуры чтения каталога. Это связано с тем, что содержание каталога может изменяться динамически: когда файлы добавляются или удаляются из каталога, операционная система приводит в порядок содержание каталога. Поскольку элементы каталога имеют различный размер, может оказаться, что сохраненное ранее абсолютное смещение больше не представляет начало элемента каталога! Поэтому мы не рекомендуем вам использовать эти функции, если вам они действительно не нужны [56].
5.4. Получение информации о файлах
Чтение каталога для получения имен файлов лишь половина дела. Получив имя файла, нужно знать, как получить остальную информацию, связанную с файлом, такую, как тип файла, права доступа к нему, владельца и т.д.
5.4.1. Типы файлов Linux
Linux (и Unix) поддерживает следующие различные типы файлов:
Обычные файлы
Как предполагает имя, данный тип используется для данных, исполняемых программ и всего прочего, что вам может понравиться. В листинге '
ls -l
-
Каталоги
Специальные файлы для связывания имен файлов с индексами. В листинге '
ls -l
d
Символические ссылки
Как описано ранее в главе. В листинге '
ls -l
l
Устройства
Файлы, представляющие как физические аппаратные устройства, так и программные псевдоустройства. Есть две разновидности:
Блочные устройства
Устройства, ввод/вывод которых осуществляется порциями некоторого фиксированного размера физической записи, такие, как дисковые и ленточные приводы. Доступ к таким устройствам осуществляется через буферный кэш ядра. В листинге '
ls -l
b
Символьные устройства
Известны также как непосредственные (raw) устройства. Первоначально символьными устройствами были те, в которых ввод/вывод осуществлялся по несколько байтов за раз, как в терминалах. Однако, символьное устройство используется также для непосредственного ввода/вывода на блочные устройства, такие, как ленты и диски, минуя буферный кэш [57]. В листинге '
ls -l
с
Именованные каналы (named pipes)
Известны также файлы FIFO («first-in first-out» — «первым вошел, первым обслужен»). Эти специальные файлы действуют подобно конвейерам (pipes); данные, записанные в них одной программой, могут быть прочитаны другой; данные не записываются на диск и не считываются с диска. FIFO создаются с помощью команды
mkfifo
ls -l
p