Разработка приложений в среде Linux. Второе издание
Шрифт:
11.3.2. Простой пример
stat
Рассмотрим простую программу, которая отображает информацию из
lstat
для каждого имени файла, переданного в аргументе. Она иллюстрирует, как использовать значения, возвращенные семейством функций stat
. 1: /* statsamp.с */
2:
3: /* Для каждого имени файла, переданного в командной строке, отображаем
4: всю информацию, которую возвращает lstat для файла. */
5:
6: #include <errno.h>
7: #include <stdio.h>
8: #include <string.h>
9: #include <sys/stat.h>
10: #include <sys/sysmacros.h>
11: #include <sys/types.h>
12: #include <time.h>
13: #include <unistd.h>
14:
15: #define TIME_STRING_BUF 50
16:
17: /*
Пользователь передает buf (минимальной длины TIME_STRING_BUF) вместо
18: использования статического для функции буфера, чтобы избежать применения
19: локальных статических переменных и динамической памяти. Никаких ошибок
20: происходить не должно, поэтому никакой проверки ошибок не делаем. */
21: char *time String (time_t t, char *buf) {
22: struct tm *local;
23:
24: local = localtime(&t);
25: strftime(buf, TIME_STRING_BUF, "%c", local);
26:
27: return buf;
28: }
29:
30: /* Отобразить всю информацию, полученную от lstat по имени
31: файла как единственному параметру. */
32: int statFile(const char *file) {
33: struct stat statbuf;
34: char timeBuf[TIME_STRING_BUF];
35:
36: if (lstat(file, &statbuf)) {
37: fprintf(stderr, "не удалось lstat %s: %s\n", file,
38: strerror(errno));
39: return 1;
40: }
41:
42: printf("Имя файла : %s\n", file);
43: printf("На устройстве: старший %d/младший %d Inode номер: %ld\n" ,
44: major(statbuf.st_dev), minor(statbuf.st_dev),
45: statbuf.st_ino);
46: printf ("Размер : %-101d Тип: %07o"
47: "Права доступа : %05o\n", statbuf.st_size,
48: statbuf.st_mode & S_IFMT, statbuf.st_mode &~(S_IFMT));
49: printf("Владелец : %d
Группа : %d"
50: " Количество ссылок : %d\n",
51: statbuf.st_uid, statbuf.st_gid, statbuf.st_nlink);
52: printf("Время создания : %s\n",
53: timeString(statbuf.st_ctime, timeBuf));
54: printf("Время модификации : %s\n",
55: timeString(statbuf.st_mtime, timeBuf));
56: printf("Время доступа : %s\n",
57: timeString (statbuf.st_atime, timeBuf));
58:
59: return 0;
60: }
61:
62: int main(int argc, const char **argv) {
63: int i;
64: int rc = 0 ;
65:
66: /* Вызвать statFile для каждого имени файла,
67: переданного в командной строке. */
68: for (i = 1; i < argc; i++) {
69: /* Если statFile сбоит, rc будет содержать не ноль.*/
70: rc |= statFile(argv[i]);
71:
72: /* это печатает пробел между позициями,
73: но не за последней */
74: if ((argc - i) > 1) printf ("\n");
75: }
76:
77: return rc;
78: }
11.3.3. Простое определение прав доступа
Хотя режим файла представляет всю информацию, которая может понадобиться программе, для определения того, имеет ли она доступ к файлу, тестирование набора прав — дело хитрое и чреватое ошибкам. Поскольку ядро ухе включает в себя код для проверки прав доступа, предусмотрен простой системный вызов, который позволяет программам определять, могут ли они получить доступ к файлу определенным образом.
#include <unistd.h>
int access(const char *pathname, int mode);
mode
— это маска, которая содержит одно или более перечисленных ниже значений. F_OK | Файл существует. Это требует прав на выполнение по всем каталогам, составляющим путь, поэтому может закончиться сбоем, даже если файл существует. |
R_OK | Процесс может читать файл. |
W_OK | Процесс может писать файл. |
X_OK | Процесс может исполнять файл (или искать в каталоге). |
Поделиться:
Популярные книги
Стеллар. Трибут
2. Стеллар
Фантастика:
боевая фантастика
рпг
8.75
рейтинг книги
Его огонь горит для меня. Том 2
2. Мир Карастели
Фантастика:
юмористическая фантастика
5.40
рейтинг книги
На границе империй. Том 9. Часть 4
17. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Наследник
1. Рюрикова кровь
Фантастика:
научная фантастика
попаданцы
альтернативная история
8.69
рейтинг книги

Совершенно несекретно
15. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Ваше Сиятельство 2
2. Ваше Сиятельство
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Прометей: каменный век II
2. Прометей
Фантастика:
альтернативная история
7.40
рейтинг книги
Единственная для темного эльфа 3
3. Мир Верея. Драконья невеста
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Жандарм
1. Жандарм
Фантастика:
попаданцы
альтернативная история
аниме
4.11
рейтинг книги
Долгий путь домой
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
6.20
рейтинг книги
Прогрессор поневоле
2. Фараон
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Наследие Маозари 6
6. Наследие Маозари
Фантастика:
попаданцы
постапокалипсис
рпг
фэнтези
эпическая фантастика
5.00
рейтинг книги
Я еще не барон
1. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Лолита
Проза:
классическая проза
современная проза
8.05