Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
Строки 81–85 обрабатывают случай «успеха», при котором размер содержимого ссылки меньше размера буфера. В этом случае добавляется завершающий ноль (строка 83), а затем буфер возвращается, прерывая бесконечный цикл. Это гарантирует, что в буфер помещено все содержимое ссылки, поскольку у
readlink()Строки 87–88 освобождают буфер и удваивают размер буфера для следующей попытки в начале цикла. Строки 89–90 обрабатывают случай, при котором размер ссылки слишком велик:
buf_sizeSSIZE_MAXSSIZE_MAXSIZE_MAXbuf_sizeНекоторое дополнительное разъяснение: условие '
SIZE_MAX / 2 < SSIZE_MAXSIZE_MAX < 2 * SSIZE_MAXbuf_sizebuf_size == 0lstat()malloc()•
lstat()• Вызов
lstat()lstat()readlink()• Некоторые системы не заполняют должным образом член
st_sizegetcwd()/procst_sizereadlink()Наконец, буфер не слишком большой,
xreadlink()free()malloc()realloc()realloc()realloc()5.5. Смена владельца, прав доступа и времени изменения
Несколько других системных вызовов дают вам возможность изменять другие относящиеся к файлу сведения: в частности, владельца и группу файла, права доступа к файлу и времена доступа и изменения файла.
5.5.1. Смена владельца файла:
chown()fchown()lchown()Владелец и группа файла изменяются с помощью трех сходных системных вызовов.
#include <sys/types.h> /* POSIX */#include <unistd.h>int chown(const char *path, uid_t owner, gid_t group);int fchown(int fd, uid_t owner, gid_t group);int lchown(const char *path, uid_t owner, gid_t group);chown()fchown()lchown()Стоит заметить, что один системный вызов изменяет как владельца, так и группу файла. Чтобы изменить лишь владельца или лишь группу, передайте (-1) в качестве того идентификационного номера, который должен остаться без изменений.
Хотя вы могли бы подумать, что можно передать соответствующее значение из полученного заранее
struct statstat()chown()Вы могли бы поинтересоваться: «Зачем нужно изменять владельца символической ссылки? Права доступа и владение ей не имеют значения». Но что случится, если пользователь уходит, а все его файлы все еще нужны? Необходима возможность изменения владельца всех файлов этого лица на кого-то еще, включая символические ссылки.
Системы GNU/Linux обычно не позволяют рядовым пользователям (не root) изменять владельца («отдавать») своих файлов. Смена группы на одну из групп пользователя, конечно, разрешена. Ограничение в смене владельцев идет от BSD систем, у которых тоже есть этот запрет. Главная причина в том, что разрешение пользователям отдавать файлы может нарушить дисковый учет. Рассмотрите такой сценарий:
$ <b>mkdir mywork</b> /* Создать каталог */$ <b>chmod go-rwx mywork</b> /* Установить права доступа drwx------ */$ <b>cd mywork</b> /* Перейти в него */$ <b>myprogram > large_data_file</b> /* Создать большой файл */$ <b>chmod ugo+rw large_data_file</b> /* Установить доступ -rw-rw-rw- */$ <b>chown otherguy large_data_file</b> /* Передать файл otherguy */В этом примере
large_data_fileotherguyotherguyotherguyotherguy