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

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

Жанры

Linux программирование в примерах

Роббинс Арнольд

Шрифт:

59 return 0;

60 }

Вот результаты запуска программы:

$ ch04-holes peoplelist /* Запустить программу */

$ ls -ls peoplelist /* Показать использованные размеры и блоки */

16 -rw-r--r-- 1 arnold devel 81944 Mar 23 17:43 peoplelist

$ echo 81944 / 4096 | bc -l /* Показать блоки, если нет дыр */

20.00585937500000000000

Случайно мы знаем, что каждый дисковый блок файла использует 4096 байтов. (Откуда мы это знаем, обсуждается в разделе 5 4.2 «Получение информации о

файле». Пока примите это как данное.) Финальная команда bc указывает, что файлу размером 81944 байтов нужен 21 дисковый блок. Однако, опция -s команды ls, которая сообщает нам, сколько блоков использует файл на самом деле, показывает, что файл использует лишь 16 блоков! [48] Отсутствующие блоки в файле являются дырами. Это показано на рис. 4.2.

48

По крайней мере, три из этих блоков содержат данные, которые мы записали, другие для использования операционной системой при отслеживании размещения этих данных — Примеч. автора.

Рис. 4.2. Дыры в файле

ЗАМЕЧАНИЕ

ch04-holes.c
не осуществляет непосредственный двоичный ввод/вывод. Это хорошо демонстрирует красоту ввода/вывода с произвольным доступом: вы можете рассматривать дисковый файл, как если бы он был очень большим массивом двоичных структур данных.

На практике сохранение данных путем использования двоичного ввода/вывода является решением, которое необходимо тщательно взвесить. Например, что если предположить, что вам нужно переместить данные на систему, использующую отличный порядок байтов для целых? Или другие форматы чисел с плавающей точкой? Или на систему с другими требованиями выравнивания? Игнорирование подобных вопросов может стать слишком дорогостоящим.

4.6. Создание файлов

Как было описано ранее,

open
, очевидно, открывает лишь существующие файлы. Данный раздел описывает, как создавать новые файлы. Есть две возможности:
creat
и
open
с дополнительными файлами. Первоначально
creat
был единственным способом создания файла, но затем эта возможность была добавлена также и к
open
. Оба механизма требуют указания начальных прав доступа к файлу.

4.6.1. Определение начальных прав доступа к файлу

Как пользователь GNU/Linux, вы знакомы с правами доступа к файлу, выдаваемыми командой '

ls -l
': на чтение, запись и исполнение для каждого из владельца файла, группы и остальных. Различные сочетания часто выражаются в восьмеричной форме, в частности, для команд
chmod
и
chmask
. Например, права доступа к файлу
– rw-r--
r-- эквивалентны восьмеричному 0644, a
– rwxr-xr-x
эквивалентно восьмеричному 0755. (Ведущий 0 в нотации С означает восьмеричные значения.)

Когда вы создаете файл, вы должны знать, какую защиту необходимо назначить новому файлу. Вы можете сделать это с помощью простого восьмеричного числа, если захотите, и такие числа довольно обычно можно увидеть в старом коде. Однако, лучше использовать побитовую операцию OR для одной или более символических имен из

<sys/stat.h>
, описанных в табл. 4.5.

Таблица 4.5. Символические имена POSIX для режимов доступа к файлу

Символическое имя Значение Комментарий
S_IRWXU
00700 Разрешение
на чтение, запись и исполнение для владельца
S_IRUSR
00400 Разрешение на чтение для владельца
S_IREAD
Аналогично
S_IRUSR
S_IWUSR
00200 Разрешение на запись для владельца
S_IWRITE
Аналогично
S_IWUSR
S_IXUSR
00100 Разрешение на исполнение для владельца.
S_IEXEC
Аналогично
S_IXUSR
S_IRWXG
00070 Разрешение на чтение, запись и исполнение для группы
S_IRGRP
00040 Разрешение на чтение для группы
S_IWGRP
00020 Разрешение на запись для группы.
S_IXGRP
00010 Разрешение на исполнение для группы
S_IRWXO
00007 Разрешение на чтение, запись и исполнение для остальных.
S_IROTH
00004 Разрешение на чтение для остальных.
S_IWOTH
00002 Разрешение на запись для остальных
S_IXOTH
00001 Разрешение на исполнение для остальных

Следующий фрагмент показывает, как создать переменные, представляющие разрешения

– rw-r--r--
и
– rwxr-xr-x
(0644 и 0755 соответственно):

mode_t rw_mode, rwx_mode;

rw_mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; /* 0644 */

rwx_mode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH; /* 0755 */

Более старый код использовал

S_IREAD
,
S_IWRITE
и
S_IEXEC
вместе со сдвигом битов для получения того же результата:

mode_t rw_mode, rwx_mode;

rw_mode = (S_IREAD|S_IWRITE) | (S_IREAD >> 3) | (S_IREAD >> 6); /* 0644 */

rwx_mode = (S_IREAD|S_IWRITE|S_IEXEC) |

 ((S_IREAD|S_IEXEC) >> 3) | ((S_IREAD|S_IEXEC) >> 6); /* 0755 */

К сожалению, ни одна из записей не является очень удобной. Современные версии предпочтительнее, поскольку у каждого бита доступа есть собственное имя и меньше вероятность неправильного выполнения побитовых операций.

Поделиться:
Популярные книги

Законы Рода. Том 4

Мельник Андрей
4. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 4

Кодекс Императора IV

Сапфир Олег
4. Кодекс Императора
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Императора IV

Потомок бога

Решетов Евгений Валерьевич
1. Локки
Фантастика:
попаданцы
альтернативная история
аниме
сказочная фантастика
5.00
рейтинг книги
Потомок бога

Архил...? 4

Кожевников Павел
4. Архил...?
Фантастика:
фэнтези
попаданцы
альтернативная история
5.50
рейтинг книги
Архил...? 4

Светлая тьма. Советник

Шмаков Алексей Семенович
6. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Светлая тьма. Советник

Отмороженный 13.0

Гарцевич Евгений Александрович
13. Отмороженный
Фантастика:
боевая фантастика
попаданцы
рпг
фантастика: прочее
фэнтези
5.00
рейтинг книги
Отмороженный 13.0

Развод с драконом. Отвергнутая целительница

Шашкова Алена
Фантастика:
фэнтези
4.75
рейтинг книги
Развод с драконом. Отвергнутая целительница

Третий

INDIGO
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий

Камень

Минин Станислав
1. Камень
Фантастика:
боевая фантастика
6.80
рейтинг книги
Камень

Наследник 2

Шимохин Дмитрий
2. Старицкий
Фантастика:
попаданцы
альтернативная история
фэнтези
5.75
рейтинг книги
Наследник 2

Солнечный корт

Сакавич Нора
4. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Солнечный корт

Переиграть войну! Пенталогия

Рыбаков Артем Олегович
Переиграть войну!
Фантастика:
героическая фантастика
альтернативная история
8.25
рейтинг книги
Переиграть войну! Пенталогия

Двойник Короля 2

Скабер Артемий
2. Двойник Короля
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Двойник Короля 2

Новик

Ланцов Михаил Алексеевич
2. Помещик
Фантастика:
альтернативная история
6.67
рейтинг книги
Новик