Linux программирование в примерах
Linux программирование в примерах читать книгу онлайн
В книге рассмотрены вопросы, связанные с программированием под Linux: файловый ввод/вывод, метаданные файлов, основы управления памятью, процессы и сигналы, пользователи и группы, вопросы интернационализации и локализации, сортировка, поиск и многие другие. Много внимания уделено средствам отладки, доступным под GNU Linux. Все темы иллюстрируются примерами кода, взятого из V7 UNIX и GNU. Эта книга может быть полезна любому, кто интересуется программированием под Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Следующий фрагмент показывает, как создать переменные, представляющие разрешения
-rw-r--r--
-rwxr-xr-x
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.6, но они не должны использоваться при первоначальном создании файла. Возможность включения этих битов широко варьирует между операционными системами. Лучше всего не пробовать; вместо этого следует изменить права доступа к файлу явным образом после его создания. (Изменение прав доступа описано в разделе 5.5.2 «Изменение прав доступа:
chmod()
fchmod()
Таблица 4.6. Дополнительные символические имена POSIX для режимов доступа к файлам
Символическое имя | Значение | Смысл |
---|---|---|
S_ISUID | 04000 | Установить ID пользователя |
S_ISGID | 02000 | Установить ID группы |
S_ISVTX | 01000 | Сохранить текст |
Когда стандартные утилиты создают файлы, они по умолчанию используют права доступа
-rw-rw-rw-
umask
действительные_права = (затребованные_права & (~umask));
umask
umask
$НОМЕ/.profile
umask()
#include <sys/types.h> /* POSIX */
#include <sys/stat.h> mode_t umask(mode_t mask);
Возвращается старое значение
umask
mode_t mask = umask(0); /* получить текущую маску */
(void)umask(mask); /* восстановить ее */
Вот пример работы
umask
$ <b>umask</b> /* Показать текущую маску */
0022
$ <b>touch newfile</b> /* Создать файл */
$ <b>ls -l newfile</b> /* Показать права доступа нового файла */
-rw-r--r-- 1 arnold devel 0 Mar 24 15:43 newfile
$ <b>umask 0</b> /* Установить пустую маску */
$ <b>touch newfile2</b> /* Создать второй файл */
$ <b>ls -l newfile2</b> /* Показать права доступа нового файла */
-rw-rw-rw- 1 arnold devel 0 Mar 24 15:44 newfile2
4.6.2. Создание файлов с помощью
creat()
Системный вызов
creat()
#include <sys/types.h> /* POSIX */
#include <sys/stat.h>
#include <fcntl.h>
int creat(const char *pathname, mode_t mode);
Аргумент
mode
pathname.с
umask
errno
Во всех остальных отношениях дескрипторы файлов, возвращаемые
creat()
open()
close()
int fd, count;
/* Проверка ошибок для краткости опущена */
fd = creat("/some/new/file", 0666);
count = write(fd, "some datan", 10);
(void)close(fd);
4.6.3. Возвращаясь к open()
Вы можете вспомнить объявление для
open()
int open(const char *pathname, int flags, mode_t mode);
Ранее мы сказали, что при открытии файла для простого ввода/вывода мы можем игнорировать аргумент
mode
creat()
open()
mode