- •Лекция-1:
- •Лекция-2:
- •Лекция-3:
- •Лекция-4:
- •Лекция-5:
- •Лекция-6:
- •Лекция-7:
- •Лекция-8:
- •Лекция-9:
- •Лекция-10:
- •Лекция-11:
- •Лекция-12:
- •Лекция-13:
- •Лекция-14:
- •Лекция-14:
- •Лекция-15:
- •Лекция-16:
- •Лекция-17:
- •Лекция-18:
- •Лекция-19:
- •Применение алгоритма банкира
- •Лекция-20:
- •Лекция-21
- •Лекция-22
- •Лекция-23
- •Лекция-24
Лекция-12:
Основным достоинством библиотечных функций является буферизация ввода/вывода, позволяющая минимизировать число системных вызовов чтения и записи. При открытии файла и создании потока библиотечные функции автоматически размещают необходимые буферы, о которых приложение может уже не заботиться.
Обеспечивается три типа буферизации:
Полная буферизация. Операции чтения и записи завершаются после того, как будет заполнен буфер ввода/вывода. Содержимое буфера записывается на диск автоматически или при вызове функции fflush.
Построчная буферизация. Практический ввод/вывод выполняется с помощью системных вызовов read, write построчно при обнаружении конца строки (перевода каретки). Обычно применяется для стандартных потоков ввода/вывода.
Отсутствие буферизации. Функции библиотеки не производят никакой буферизации, являясь лишь программной оболочкой системных вызовов. При этом достигаются минимальные задержки операции чтения или записи. Применяется для стандартного потока вывода сообщений об ошибках.
Характер буферизации может быть изменен с помощью следующих функций:
void setbuf (FILE *stream , char *buf);
int setbuf (file *stream, char *buf, int type, size_t size);
type _IOFBF, _IOLBF, _IONBF
BUFSIZE или stat.st_blksize
Функция setbuf позволяет включить/выключить буферизацию для потока, указанного в качестве первого аргумента. Если второй аргумент указывает на буфер размером size, то буферизация включается, а если тут стоит NULL, то выключается.
Функция setvbuf позволяет установить тип буферизации (третий аргумент). Её четвёртый аргумент определяет размер буфера, адресованного вторым аргументом.
Каждый поток в стандартной библиотеке представлен указателем на структуру FILE, которая содержит следующие поля:
Указатель на следующий символ
Число байт в буфере
Указатель на буфер
Флаги состояния потока
Указатель на файловый дескриптор
Размер буфера определяется либо значением специального поля в структуре stat, либо с помощью стандартного значения BUFERSIZE, определённого в библиотеке.
Файлы отображаемые в памяти
#include <sys/types.h>
#include <sys/mman.h>
caddr_tmmap(caddr_t addr,size_t len,int prot,int flags,int fields,off_t off);
Системный вызов mmap предоставляет доступ к файлам, альтернативный вызовам read и write. С помощью этого вызова процесс может отображать участки файлов в своё адресное пространство. После этого данные файла могут быть получены или записаны путем чтения, записи в память.
Этот вызов задает отображение числа байтов, определённых len, для файла с дескриптором fildes, начиная со смещения off в область памяти со стартовым адресом addr. Перед вызовом mmap файл должен быть открыт с помощью функции open.
Аргумент prot определяет права доступа к области памяти, которые должны соответствовать правам доступа к файлу. Значение len ОС округляет до границы следующей страницы виртуальной памяти (выделяется область, кратная странице).
Использование права на выполнения, позволяет процессу определить собственный механизм загрузки кода. Такой подход используется редактором динамических связей, при загрузке динамических библиотек, когда библиотека отображается в адресное пространство процесса.
Аргумент flags определяет дополнительные особенности управления памятью и может иметь следующие значения:
MAP_SHARED область памяти может использоваться несколькими процессами
MAP_PRIVETE область памяти используется только вызывающим процессом
MAP_FIXED требуется выделение памяти начиная точно с addr
MAP_NORESERVED не требуется резервировать область свопинга
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
main (int argc, char *argv[])
{
int fd_src, fd_dst;
caddr_t addr_src, addr_dst;
struct stat filestat
fd_src=open(argv[1],O_RDONLY);
fd_dst=open(argv[2],O_RDWR|O_CREAT);
fstat(fd_src, &filestat);
lseek(fd_dst, filestat.st_size-1,EEK_SET);
write(fd_dst,“ ”,1);
addr_src=mmap((caddt_t)0,filesta.st_size,PROT_READ,MAP_SHARED,fd_src,0));
addr_dst=mmap((caddr_t)0,filestat.st_size,PROT_READ|PROT_WRITE, MAP_SHARED, fd_dst);
memcpy(addr_dst,addr_src,filestat.st_size);
exit(1);
}
Метаданные файла
Каждый файл имеет, помимо своих собственных данных, метаданные, которые описывают его характеристики.
#include <sys/types.h>
#include <sys/stat.h>
int stat (const char *path, struct stat *buf);
int lstat (const char *path, struct stat *buf);
int fstat (int fildes, struct stat *buf);
mode_t st_mode тип файла и права доступа
ino_t st_ino номер дескриптора или структуры (inode), где хранятся метаданные данного файла
dev_t st_dev идентификатор устройства, содержащего файл
dev_t st_rdev для специального файлового устройства, содержит номер устройства, адресуемого этим файлом
nlink_t st_nlink число жестких связей файла
uid_t st_uid пользовательский идентификатор (владелец) файла
gid_t st_gid идентификатор группы владельца файла
off_t st_size размер обычного файла в байтах; для специального файла устройств это поле не определено
time_t st_atime время последнего доступа к файлу
time_t st_mtime время последней модификации файла
time_t st_ctime время последнего изменения метаданных файла
long st_blksize оптимальный размер блока для операций ввода/вывода; для специальных файлов это поле не определено
long st_blocks число размещенных 512 байтовых блоков, которые выделены для хранения данных файла
Для определения типа файла используются специальные макроопределения:
S_ISFIFO FIFO
S_ISCHR символьное устройство
S_ISDIR каталог
S_ISBLK блочное устройство
S_ISREG обычный файл
S_ISLNK символическая связь
S_ISSOCK сокет
Существуют функции, позволяющие изменить владельца файла и владельца группы, а также изменить права доступа к файлу.