Читать книгу 📗 "Операционная система UNIX - Робачевский Андрей Михайлович"
if (nread < 0) { perror("readlink"); exit(1); } /* readlink не завершает строку ' ' */ printf("Символическая связь:n %sn", buf); /* Теперь прочитаем содержимое целевого файла */ printf("Читаем целевой файлn"); fd = open(argv[1], O_RDONLY); if (fd < 0) { perror("open"); exit(2); } nread = read(fd, buf, BUFSIZ); if (nread < 0) { perror("read"); exit(3); } buf[nread] = ' '; printf("Целевой файл:n %sn", buf); close(fd); exit(0);}Перед тем как запустить программу, создадим символическую связь с файлом unix0.txt:
$ <b>ln -s unix0.txt symlink.txt</b>$ <b>ls -l</b>lrwxrwxrwx 1 andy user 10 Jan 6 09:54 symlink.txt -> unix0.txt-rw-r--r-- 1 andy user 498 Jan 6 09:53 unix0.txt$ <b>a.out symlink.txt</b>Читаем символическую связьСимволическая связь:unix0.txtЧитаем целевой файлЦелевой файл:Начиная с 1975 года фирма AT&T начала предоставлять лицензии наиспользование операционной системы как научно-образовательнымучреждениям, так и коммерческим организациям. Поскольку основнаячасть системы поставлялась в исходных текстах, написанных наязыке С, опытным программистам не требовалось детальнойдокументации, чтобы разобраться в архитектуре UNIX. С ростомпопулярности микропроцессоров...Файлы, отображаемые в памяти
Системный вызов mmap(2) предоставляет механизм доступа к файлам, альтернативный вызовам read(2) и write(2). С помощью этого вызова процесс имеет возможность отобразить участки файла в собственное адресное пространство. После этого данные файла могут быть получены или записаны путем чтения или записи в память. Функция mmap(2) определяется следующим образом:
#include <sys/types.h>#include <sys/mman.h>caddr_t mmap(caddr_t addr, size_t len, int prot, int flags, int fildes, off_t off);Этот вызов задает отображение
lenfildesoffaddrprotprotPROT_READ | PROT_WRITEO_RDWRТаблица 2.12. Права доступа к области памяти
| Значение аргумента prot | Описание | Права доступа к файлу |
|---|---|---|
PROT_READ | Область доступна для чтения | r |
PROT_WRITE | Область доступна для записи | w |
PROT_EXEC | Область доступна для исполнения | x |
PROT_NONE | Область недоступна | - |
Обычно значение
addrОперационная система округляет значение len до следующей страницы виртуальной памяти. [19] Например, если размер файла 96 байтов, а размер страницы 4 Кбайт, то система все равно выделит область памяти размером 4096 байтов. При этом 96 байтов займут собственно данные файла, а остальные 4000 байтов будут заполнены нулями. Процесс может модифицировать и оставшиеся 4000 байтов, но эти изменения не отразятся на содержимом файла. При обращении к участку памяти, лежащему за пределами файла, ядро отправит процессу сигнал
SIGBUSИспользование права на исполнение (
prot = PROT_EXECPROT_NONEАргумент
flagsflags