Linux программирование в примерах
Linux программирование в примерах читать книгу онлайн
В книге рассмотрены вопросы, связанные с программированием под Linux: файловый ввод/вывод, метаданные файлов, основы управления памятью, процессы и сигналы, пользователи и группы, вопросы интернационализации и локализации, сортировка, поиск и многие другие. Много внимания уделено средствам отладки, доступным под GNU Linux. Все темы иллюстрируются примерами кода, взятого из V7 UNIX и GNU. Эта книга может быть полезна любому, кто интересуется программированием под Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
(Тест '
!strcmp(s1, s2)
strcmp(s1, s2) == 0
!strcmp(s1, s2)
strcmp()
Когда 4.2 BSD представило новый формат файловой системы, который допускал длинные имена файлов и обеспечивал лучшую производительность, были также представлены несколько новых функций для абстрагирования чтения каталогов. Этот набор функций можно использовать независимо от того, какова лежащая в основе файловая система и как организованы каталоги. Основная ее часть стандартизована POSIX, а программы, использующие ее, переносимы между системами GNU/Linux и Unix.
5.3.1. Базовое чтение каталогов
Элементы каталогов представлены
struct dirent
struct direct
struct dirent {
...
ino_t d_ino; /* расширение XSI --- см. текст */
char d_name[...]; /* О размере этого массива см. в тексте */
...
};
Для переносимости POSIX указывает лишь поле
d_name
d_name
NAME_MAX
NAME_MAX
<limits.h>
d_ino
На практике, поскольку имена файлов могут быть различной длины, a
NAME_MAX
struct dirent
Следующие функции предоставляют интерфейс чтения каталогов:
#include <sys/types.h> /* POSIX */
#include <dirent.h>
DIR *opendir(const char *name); /* Открыть каталог для чтения */
struct dirent *readdir(DIR *dir); /* Вернуть struct dirent за раз */
int closedir(DIR *dir); /* Закрыть открытый каталог */
void rewinddir(DIR *dirp); /* Вернуться в начало каталога */
Тип
DIR
FILE
<stdio.h>
opendir()
NULL
Открыв переменную
DIR*
struct dirent
readdir()
NULL
Наконец,
closedir()
fclose()
<stdio.h>
DIR*
rewinddir()
Имея в распоряжении (или по крайней мере в библиотеке С) эти функции, мы можем написать небольшую программу
catdir
ch05-catdir.с
1 /* ch05-catdir.с - Демонстрация opendir(), readdir(), closedir(). */
2
3 #include <stdio.h> /* для printf() и т.д. */
4 #include <errno.h> /* для errno */
5 #include <sys/types.h> /* для системных типов */
6 #include <dirent.h> /* для функций каталога */
7
8 char *myname;
9 int process(char *dir);
10
11 /* main --- перечисление аргументов каталога */
12
13 int main(int argc, char **argv)
14 {
15 int i;
16 int errs = 0;
17
18 myname = argv[0];
19
20 if (argc == 1)
21 errs = process("."); /* по умолчанию текущий каталог */
22 else
23 for (i = 1; i < argc; i++)
24 errs += process(argv[i]);
25
26 return (errs != 0);
27 }
Эта программа вполне подобна
ch04-cat.c
main()
29 /*
30 * process --- сделать что-то с каталогом, в данном случае,
31 * вывести пары индекс/имя в стандартный вывод.
32 * Возвращает 0, если все OK, иначе 1.
33 */
34
35 int
36 process(char *dir)
37 {