Linux программирование в примерах
Linux программирование в примерах читать книгу онлайн
В книге рассмотрены вопросы, связанные с программированием под Linux: файловый ввод/вывод, метаданные файлов, основы управления памятью, процессы и сигналы, пользователи и группы, вопросы интернационализации и локализации, сортировка, поиск и многие другие. Много внимания уделено средствам отладки, доступным под GNU Linux. Все темы иллюстрируются примерами кода, взятого из V7 UNIX и GNU. Эта книга может быть полезна любому, кто интересуется программированием под Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
int whence
Описывает положение в файле, относительно которого отсчитывается
offset
Таблица 4.4. Значения
whence
lseek()
Именованная константа | Значение | Комментарий |
---|---|---|
SEEK_SET | 0 | offset |
SEEK_CUR | 1 | offset |
SEEK_END | 2 | offset |
Большое количество старого кода использует числовые значения, приведенные в табл. 4.4. Однако, любой новый код, который вы пишете, должен использовать символические имена, значение которых более ясно.
Смысл значений и их действие на положение в файле показаны на рис. 4.1. При условии, что файл содержит 3000 байтов и что перед каждым вызовом
lseek()
Рис. 4.1. Смещения для
lseek()
Отрицательные смещения относительно начала файла бессмысленны; они вызывают ошибку «недействительный параметр».
Возвращаемое значение является новым положением в файле. Поэтому, чтобы получить ваше текущее местоположение в файле, используйте
off_t curpos;
...
curpos = lseek(fd, (off_t)0, SEEK_CUR);
Буква
l
lseek()
long
lseek()
seek()
long
off_t
curpos = lseek(fd, 0L, SEEK_CUR);
На системах с компилятором стандартного С, где
lseek()
long
off_t
Одной интересной и важной особенностью
lseek()
Следующая программа демонстрирует создание дыр. Она записывает три экземпляра
struct
1 /* ch04-holes.c --- Демонстрация lseek() и дыр в файлах. */
2
3 #include <stdio.h> /* для fprintf(), stderr, BUFSIZ */
4 #include <errno.h> /* объявление errno */
5 #include <fcntl.h> /* для flags для open() */
6 #include <string.h> /* объявление strerror() */
7 #include <unistd.h> /* для ssize_t */
8 #include <sys/types.h> /* для off_t, etc. */
9 #include <sys/stat.h> /* для mode_t */
10
11 struct person {
12 char name[10]; /* имя */
13 char id[10]; /* идентификатор */
14 off_t pos; /* положение в файле для демонстрации */
15 } people[] = {
16 { "arnold", "123456789", 0 },
17 { "miriam", "987654321", 10240 },
18 { "joe", "192837465", 81920 },
19 };
20
21 int
22 main(int argc, char **argv)
23 {
24 int fd;
25 int i, j;
26
27 if (argc < 2) {
28 fprintf(stderr, "usage: %s filen", argv[0]);
29 return 1;
30 }
31
32 fd = open(argv[1], O_RDWR | O_CREAT | O_TRUNC, 0666);
33 if (fd < 0) {
34 fprintf(stderr, "%s: %s: cannot open for read/write: %sn",
35 argv[0], argv[1], strerror(errno));
36 return 1;
37 }
38
39 j = sizeof(people) / sizeof(people[0]); /* число элементов */
Строки 27–30 гарантируют, что программа была вызвана правильно. Строки 32–37 открывают именованный файл и проверяют успешность открытия.
Вычисление числа элементов
j
NULL