Linux программирование в примерах
Linux программирование в примерах читать книгу онлайн
В книге рассмотрены вопросы, связанные с программированием под Linux: файловый ввод/вывод, метаданные файлов, основы управления памятью, процессы и сигналы, пользователи и группы, вопросы интернационализации и локализации, сортировка, поиск и многие другие. Много внимания уделено средствам отладки, доступным под GNU Linux. Все темы иллюстрируются примерами кода, взятого из V7 UNIX и GNU. Эта книга может быть полезна любому, кто интересуется программированием под Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Некоторые системы System V разрешают пользователям передавать свои файлы. (При смене владельца соответствующие биты файлов
setuid
setgid
.tar
.cpio
tar
cpio
chown()
В разделе 6.3 «Имена пользователя и группы» мы увидим, как соотносить имена пользователя и группы с соответствующими числовыми значениями
5.5.2. Изменение прав доступа:
chmod()
fchmod()
Изменение прав доступа осуществляется с помощью одного из двух системных вызовов,
chmod()
fchmod()
#include <sys/types.h> /* POSIX */
#include <sys/stat.h>
int chmod(const char *path, mode_t mode);
int fchmod(int fildes, mode_t mode);
chmod()
fchmod()
lchmod()
root
Значение mode создается таким же образом, как для
open()
creat()
Система не допустит установки бита setgid (
S_ISGID
root
root
5.5.3. Изменение временных отметок:
utime()
Структура
struct stat
time_t
st_atime
st_mtime
st_ctime
Значение
time_t
Значения
time_t
time_t
Системный вызов
utime()
#include <sys/types.h> /* POSIX */
#include <utime.h>
int utime(const char *filename, struct utimbuf *buf);
Структура
utimbuf
struct utimbuf {
time_t actime; /* время доступа */
time_t modtime; /* время изменения */
};
При успешном вызове возвращается 0, в противном случае возвращается -1. Если
buf
NULL
Чтобы изменить только одну временную отметку, используйте оригинальное значение из
struct stat
/* Для краткости проверка ошибок опущена */
struct stat sbuf;
struct utimbuf ut;
time_t now;
time(&now); /* Получить текущее время дня, см. след. главу */
stat("/some/file", &sbuf); /* Заполнить sbuf */
ut.actime = sbuf.st_atime; /* Время доступа без изменений */
ut.modtime = now - (24 * 60 * 60);
/* Установить modtime на 24 часа позже */
utime("/some/file", &ut); /* Установить значения */
Вы можете спросить себя: «Почему может понадобиться кому-нибудь изменять времена доступа и изменения файла?» Хороший вопрос.
Чтобы на него ответить, рассмотрите случай программы, создающей дублирующие архивы, такой, как
tar
cpio
Однако, этот файл, возможно, не читался человеком в течение 10 лет. Некто, набрав '
ls -lu
utime()
Аналогичным образом, рассмотрите случай архивирующей программы, восстанавливающей файл из архива. В архиве хранятся первоначальные значения времени доступа и изменения. Однако, когда файл извлечен из архива во вновь созданную копию на диске, новый файл имеет текущие дату и время для значений времени доступа и изменения.
Однако полезнее, когда вновь созданный файл выглядит, как если бы он имел тот же возраст, что и оригинальный файл в архиве. Поэтому архиватор должен иметь возможность устанавливать значения времени доступа и изменения в соответствии со значениями в архиве.