Linux программирование в примерах
Linux программирование в примерах читать книгу онлайн
В книге рассмотрены вопросы, связанные с программированием под Linux: файловый ввод/вывод, метаданные файлов, основы управления памятью, процессы и сигналы, пользователи и группы, вопросы интернационализации и локализации, сортировка, поиск и многие другие. Много внимания уделено средствам отладки, доступным под GNU Linux. Все темы иллюстрируются примерами кода, взятого из V7 UNIX и GNU. Эта книга может быть полезна любому, кто интересуется программированием под Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Некоторые из этих масок служат цели изолирования различных наборов битов, закодированных в поле
st_mode
•
S_IFMT
•
S_IRWXU
•
S_IRWXG
•
S_IRWXO
Биты прав доступа и типа файла графически изображены на рис. 5.3.
Рис. 5.3. Биты прав доступа и типа файлов
Маски типов файлов стандартизованы главным образом для совместимости со старым кодом; они не должны использоваться непосредственно, поскольку такой код менее читаем, чем соответствующие макросы. Случается, что макрос реализован с использованием масок: довольно логично, но это не подходит для кода уровня пользователя.
Стандарт POSIX явным образом констатирует; что в будущем не будут стандартизированы новые битовые маски и что тесты для любых дополнительных разновидностей типов файлов, которые могут быть добавлены, будут доступны лишь в виде макросов
S_IS<i>xxx</i>()
5.4.4.1. Сведения об устройстве
Стандарт POSIX не определяет значение типа
dev_t
dev_t
Когда истинно
S_ISBLK(sbuf.st_mode)
S_ISCHR(sbuf.st_mode)
sbuf.st_rdev
Традиционно файлы устройств Unix кодируют старший и младший номера устройства в значении
dev_t
ls -l
$ <b>ls -l /dev/hda /dev/hda?</b> /* Показать номера для первого жесткого диска */
brw-rw---- 1 root disk 3, 0 Aug 31 2002 /dev/hda
brw-rw---- 1 root disk 3, 1 Aug 31 2002 /dev/hda1
brw-rw---- 1 root disk 3, 2 Aug 31 2002 /dev/hda2
brw-rw---- 1 root disk 3, 3 Aug 31 2002 /dev/hda3
brw-rw---- 1 root disk 3, 4 Aug 31 2002 /dev/hda4
brw-rw---- 1 root disk 3, 5 Aug 31 2002 /dev/hda5
brw-rw---- 1 root disk 3, 6 Aug 31 2002 /dev/hda6
brw-rw---- 1 root disk 3, 7 Aug 31 2002 /dev/hda7
brw-rw---- 1 root disk 3, 8 Aug 31 2002 /dev/hda8
brw-rw---- 1 root disk 3, 9 Aug 31 2002 /dev/hda9
$ <b>ls -l /dev/null</b> /* Показать сведения также для /dev/null */
crw-rw-rw- 1 root root 1, 3 Aug 31 2002 /dev/null
Вместо размера файла
ls
/dev/hda
/dev/hda1
/dev/hda2
Обратите внимание, что дисковые устройства являются блочными устройствами, тогда как
/dev/null
Старший и младший номера устройства можно извлечь из значения
dev_t
major()
minor()
<sys/sysmacros.h>
#include <sys/types.h> /* Обычный */
#include <sys/sysmacros.h>
int major(dev_t dev); /* Старший номер устройства */
int minor(dev_t dev); /* Младший номер устройства */
dev_t makedev(int major, int minor); /* Создать значение dev_t */
(Некоторые системы реализуют их в виде макросов.)
Функция
makedev()
dev_t
Следующая программа,
ch05-devnum.c
stat()
major()
minor()
/* ch05-devnum.c --- Демонстрация stat(), major(), minor(). */
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/sysmacros.h>
int main(int argc, char **argv) {
struct stat sbuf;
char *devtype;
if (argc != 2) {
fprintf(stderr, "usage: %s pathn", argv[0]);
exit(1);
}
if (stat(argv[1], &sbuf) < 0) {
fprintf(stderr, "%s: stat: %sn", argv[1], strerror(errno));
exit(1);
}
if (S_ISCHR(sbuf.st_mode))