Чтение онлайн

на главную - закладки

Жанры

Разработка приложений в среде 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

Понарошку Евгений
2. Государственный маг
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Ученичество. Книга 2

Император поневоле

Распопов Дмитрий Викторович
6. Фараон
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Император поневоле

Лорд Системы 7

Токсик Саша
7. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 7

Целитель. Книга вторая

Первухин Андрей Евгеньевич
2. Целитель
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Целитель. Книга вторая

Темный Патриарх Светлого Рода 3

Лисицин Евгений
3. Темный Патриарх Светлого Рода
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Темный Патриарх Светлого Рода 3

Случайная свадьба (+ Бонус)

Тоцка Тала
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Случайная свадьба (+ Бонус)

Прометей: каменный век II

Рави Ивар
2. Прометей
Фантастика:
альтернативная история
7.40
рейтинг книги
Прометей: каменный век II

Жребий некроманта. Надежда рода

Решетов Евгений Валерьевич
1. Жребий некроманта
Фантастика:
фэнтези
попаданцы
6.50
рейтинг книги
Жребий некроманта. Надежда рода

Возвышение Меркурия

Кронос Александр
1. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия

Не грози Дубровскому! Том Х

Панарин Антон
10. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому! Том Х

Идеальный мир для Лекаря 12

Сапфир Олег
12. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 12

Хочу тебя навсегда

Джокер Ольга
2. Люби меня
Любовные романы:
современные любовные романы
5.25
рейтинг книги
Хочу тебя навсегда

СД. Том 15

Клеванский Кирилл Сергеевич
15. Сердце дракона
Фантастика:
героическая фантастика
боевая фантастика
6.14
рейтинг книги
СД. Том 15

Смерть может танцевать 3

Вальтер Макс
3. Безликий
Фантастика:
боевая фантастика
5.40
рейтинг книги
Смерть может танцевать 3