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

На нашем литературном портале можно бесплатно читать книгу Linux программирование в примерах, Роббинс Арнольд-- . Жанр: Программирование / ОС и Сети. Онлайн библиотека дает возможность прочитать весь текст и даже без регистрации и СМС подтверждения на нашем литературном портале bazaknig.info.
Linux программирование в примерах
Название: Linux программирование в примерах
Дата добавления: 16 январь 2020
Количество просмотров: 937
Читать онлайн

Linux программирование в примерах читать книгу онлайн

Linux программирование в примерах - читать бесплатно онлайн , автор Роббинс Арнольд

В книге рассмотрены вопросы, связанные с программированием под Linux: файловый ввод/вывод, метаданные файлов, основы управления памятью, процессы и сигналы, пользователи и группы, вопросы интернационализации и локализации, сортировка, поиск и многие другие. Много внимания уделено средствам отладки, доступным под GNU Linux. Все темы иллюстрируются примерами кода, взятого из V7 UNIX и GNU. Эта книга может быть полезна любому, кто интересуется программированием под Linux.

 

Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала

1 ... 59 60 61 62 63 64 65 66 67 ... 253 ВПЕРЕД
Перейти на страницу:

Функция

rpl_utime()
(строки 75–82) является «заместителем
utime()
». Если второй аргумент не равен
NULL
, она вызывает настоящую
utime()
. В противном случае она вызывает
utime_null()
.

5.5.4. Использование

fchown()
и
fchmod()
для обеспечения безопасности

В исходных системах Unix были только системные вызовы

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

Однако, после открытия файла условие состязания больше не представляет проблему. Программа может использовать

stat()
с именем файла для получения информации о файле. Если получены сведения, которые ожидались, после открытия файла
fstat()
может проверить, что файл тот же самый (сравнив поля
st_dev
и
st_ino
структур
struct stat
«до» и «после»).

Когда программа знает, что файлы те же самые, владение или права доступа могут быть изменены с помощью

fchown()
или
fchmod()
.

Эти системные вызовы, также как

lchown()
, сравнительно недавние; [63] в старых системах Unix их не было, хотя в современных совместимых с POSIX системах они есть.

Соответствующих функций

futime()
или
lutime()
нет. В случае
futime()
это (очевидно) потому, что временные отметки не являются критическими для безопасности системы в том же отношении, что для владения и прав доступа,
lutime()
отсутствует потому, что временные отметки неуместны для символических ссылок.

5.6. Резюме

• Иерархия файлов и каталогов, как она видится пользователю, является одним логическим деревом, корень которого находится в

/
. Оно составлено из одного или более разделов, каждый из которых содержит файловую систему. Внутри файловой системы в индексах хранятся данные о файлах (метаданные), включая размещение блоков данных.

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

• Прямые ссылки создаются с помощью

link()
, символические ссылки создаются с помощью
symlink()
, ссылки удаляются с помощью
unlink()
, а переименовываются файлы (с возможным перемещением в другой каталог) с помощью
rename()
. Блоки данных файла не освобождаются до тех пор, пока счетчик ссылок не достигнет нуля и не закроется последний открытый дескриптор файла.

• Каталоги создаются с помощью

mkdir()
, а удаляются с помощью
rmdir()
; перед удалением каталог должен быть пустым (не оставлено ничего, кроме '
.
' и '
..
'). GNU/Linux версия функции ISO С
remove()
вызывает соответствующие функции
unlink()
или
rmdir()
.

• Каталоги обрабатываются с помощью функций

opendir()
,
readdir()
,
rewinddir()
и
closedir()
.
struct dirent
содержит номер индекса и имя файла. Максимально переносимый код использует в члене
d_name
только имя файла. Функции BSD
telldir()
и
seekdir()
для сохранения и восстановления текущего положения в каталоге широко доступны, но не полностью переносимы, как другие функции работы с каталогами.

• Вспомогательные данные получаются с помощью семейства системных вызовов

stat()
, структура
struct stat
содержит всю информацию о файле за исключением имени файла. (В самом деле, поскольку у файла может быть множество имен или он может совсем не иметь ссылок, невозможно сделать имя доступным.)

• Макрос

S_IS<i>xxx</i>()
в
&lt;sys/stat.h&gt;
дает возможность определить тип файла. Функции
major()
и
minor()
из
&lt;sys/sysmacros.h&gt;
дают возможность расшифровки значений
dev_t
, представляющих блочные и символьные устройства.

• Символические ссылки можно проверить, использовав

lstat()
, а поле
st_size
структуры
struct stat
для символической ссылки возвращает число байтов, необходимых для размещения имени указываемого файла. Содержимое символической ссылки читают с помощью
readlink()
. Нужно позаботиться о том, чтобы размер буфера был правильным и чтобы завершить полученное имя файла нулевым байтом, чтобы можно было его использовать в качестве строки С.

• Несколько разнообразных системных вызовов обновляют другие данные: семейство

chown()
используется для смены владельца и группы, процедуры
chmod()
для прав доступа к файлу, a
utime()
для изменения значений времени доступа и изменения файла.

Упражнения

1. Напишите программу '

const char *fmt_mode(mode_t mode)
'. Ввод представляет собой значение
mode_t
, полученное из поля
st_mode
структуры
struct stat
; т.е. оно содержит как биты прав доступа, так и типа файла.

Вывод должен представлять строку в 10 символов, идентичную первому полю вывода '

ls -l
'. Другими словами, первый символ обозначает тип файла, а остальные девять — права доступа.

Когда установлены биты

S_ISUID
и
S_IXUSR
, используйте
s
вместо
x
; если установлен лишь бит
I_ISUID
, используйте
S
. То же относится к битам
S_ISGID
и
S_IXGRP
. Если установлены оба бита
S_ISVTX
и
S_IXOTH
, используйте
t
; для одного
S_ISVTX
используйте
T
.

1 ... 59 60 61 62 63 64 65 66 67 ... 253 ВПЕРЕД
Перейти на страницу:
Комментариев (0)
название