Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект 17 страниц.doc
Скачиваний:
14
Добавлен:
15.06.2014
Размер:
826.37 Кб
Скачать

Лекция-12:

Основным достоинством библиотечных функций является буферизация ввода/вывода, позволяющая минимизировать число системных вызовов чтения и записи. При открытии файла и создании потока библиотечные функции автоматически размещают необходимые буферы, о которых приложение может уже не заботиться.

Обеспечивается три типа буферизации:

  1. Полная буферизация. Операции чтения и записи завершаются после того, как будет заполнен буфер ввода/вывода. Содержимое буфера записывается на диск автоматически или при вызове функции fflush.

  2. Построчная буферизация. Практический ввод/вывод выполняется с помощью системных вызовов read, write построчно при обнаружении конца строки (перевода каретки). Обычно применяется для стандартных потоков ввода/вывода.

  3. Отсутствие буферизации. Функции библиотеки не производят никакой буферизации, являясь лишь программной оболочкой системных вызовов. При этом достигаются минимальные задержки операции чтения или записи. Применяется для стандартного потока вывода сообщений об ошибках.

Характер буферизации может быть изменен с помощью следующих функций:

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, которая содержит следующие поля:

  1. Указатель на следующий символ

  2. Число байт в буфере

  3. Указатель на буфер

  4. Флаги состояния потока

  5. Указатель на файловый дескриптор

Размер буфера определяется либо значением специального поля в структуре 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);

  1. mode_t st_mode  тип файла и права доступа

  2. ino_t st_ino  номер дескриптора или структуры (inode), где хранятся метаданные данного файла

  3. dev_t st_dev  идентификатор устройства, содержащего файл

  4. dev_t st_rdev  для специального файлового устройства, содержит номер устройства, адресуемого этим файлом

  5. nlink_t st_nlink  число жестких связей файла

  6. uid_t st_uid  пользовательский идентификатор (владелец) файла

  7. gid_t st_gid  идентификатор группы владельца файла

  8. off_t st_size  размер обычного файла в байтах; для специального файла устройств это поле не определено

  9. time_t st_atime  время последнего доступа к файлу

  10. time_t st_mtime  время последней модификации файла

  11. time_t st_ctime  время последнего изменения метаданных файла

  12. long st_blksize  оптимальный размер блока для операций ввода/вывода; для специальных файлов это поле не определено

  13. long st_blocks  число размещенных 512 байтовых блоков, которые выделены для хранения данных файла

Для определения типа файла используются специальные макроопределения:

S_ISFIFO  FIFO

S_ISCHR  символьное устройство

S_ISDIR  каталог

S_ISBLK  блочное устройство

S_ISREG  обычный файл

S_ISLNK  символическая связь

S_ISSOCK  сокет

Существуют функции, позволяющие изменить владельца файла и владельца группы, а также изменить права доступа к файлу.