Linux программирование в примерах
Linux программирование в примерах читать книгу онлайн
В книге рассмотрены вопросы, связанные с программированием под Linux: файловый ввод/вывод, метаданные файлов, основы управления памятью, процессы и сигналы, пользователи и группы, вопросы интернационализации и локализации, сортировка, поиск и многие другие. Много внимания уделено средствам отладки, доступным под GNU Linux. Все темы иллюстрируются примерами кода, взятого из V7 UNIX и GNU. Эта книга может быть полезна любому, кто интересуется программированием под Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Работа осуществляется в цикле (строки 41–55), который отыскивает смещение байтов, приведенное в каждой структуре (строка 42), а затем записывает всю структуру (строка 49):
41 for (i = 0; i < j; i++) {
42 if (lseek(fd, people[i].pos, SEEK_SET) < 0) {
43 fprintf(stderr, "%s: %s: seek error: %sn",
44 argv[0], argv[1], strerror(errno));
45 (void)close(fd);
46 return 1;
47 }
48
49 if (write(fd, &people[i], sizeof(people[i])) != sizeof(people[i])) {
50 fprintf(stderr, "%s: %s: write error: %sn",
51 argv[0], argv[1], strerror(errno));
52 (void)close(fd);
53 return 1;
54 }
55 }
56
57 /* здесь все нормально */
58 (void)close(fd);
59 return 0;
60 }
Вот результаты запуска программы:
$ <b>ch04-holes peoplelist</b> /* Запустить программу */
$ <b>ls -ls peoplelist</b> /* Показать использованные размеры и блоки */
16 -rw-r--r-- 1 arnold devel 81944 Mar 23 17:43 peoplelist
$ <b>echo 81944 / 4096 | bc -l</b> /* Показать блоки, если нет дыр */
20.00585937500000000000
Случайно мы знаем, что каждый дисковый блок файла использует 4096 байтов. (Откуда мы это знаем, обсуждается в разделе 5 4.2 «Получение информации о файле». Пока примите это как данное.) Финальная команда bc указывает, что файлу размером 81944 байтов нужен 21 дисковый блок. Однако, опция -s команды ls, которая сообщает нам, сколько блоков использует файл на самом деле, показывает, что файл использует лишь 16 блоков! [48] Отсутствующие блоки в файле являются дырами. Это показано на рис. 4.2.
Рис. 4.2. Дыры в файле
ЗАМЕЧАНИЕ.
ch04-holes.c
На практике сохранение данных путем использования двоичного ввода/вывода является решением, которое необходимо тщательно взвесить. Например, что если предположить, что вам нужно переместить данные на систему, использующую отличный порядок байтов для целых? Или другие форматы чисел с плавающей точкой? Или на систему с другими требованиями выравнивания? Игнорирование подобных вопросов может стать слишком дорогостоящим.
4.6. Создание файлов
Как было описано ранее,
open()
creat()
open()
creat()
open()
4.6.1. Определение начальных прав доступа к файлу
Как пользователь GNU/Linux, вы знакомы с правами доступа к файлу, выдаваемыми командой '
ls -l
chmod
chmask
-rw-r--
-rwxr-xr-x
Когда вы создаете файл, вы должны знать, какую защиту необходимо назначить новому файлу. Вы можете сделать это с помощью простого восьмеричного числа, если захотите, и такие числа довольно обычно можно увидеть в старом коде. Однако, лучше использовать побитовую операцию OR для одной или более символических имен из
<sys/stat.h>
Таблица 4.5. Символические имена POSIX для режимов доступа к файлу
Символическое имя | Значение | Комментарий |
---|---|---|
S_IRWXU | 00700 | Разрешение на чтение, запись и исполнение для владельца |
S_IRUSR | 00400 | Разрешение на чтение для владельца |
S_IREAD | Аналогично S_IRUSR | |
S_IWUSR | 00200 | Разрешение на запись для владельца |
S_IWRITE | Аналогично S_IWUSR | |
S_IXUSR | 00100 | Разрешение на исполнение для владельца. |
S_IEXEC | Аналогично S_IXUSR | |
S_IRWXG | 00070 | Разрешение на чтение, запись и исполнение для группы |
S_IRGRP | 00040 | Разрешение на чтение для группы |
S_IWGRP | 00020 | Разрешение на запись для группы. |
S_IXGRP | 00010 | Разрешение на исполнение для группы |
S_IRWXO | 00007 | Разрешение на чтение, запись и исполнение для остальных. |
S_IROTH | 00004 | Разрешение на чтение для остальных. |
S_IWOTH | 00002 | Разрешение на запись для остальных |
S_IXOTH | 00001 | Разрешение на исполнение для остальных |