Хрестоматия по программированию на Си в Unix



Системные вызовы и взаимодействие с UNIX. Хрестоматия по программированию на Си в Unix - стр. 6


Создаваемая ею копия I-узла в памяти ядра содержит поля i_dev и i_number (которые на самом диске не хранятся!).

Рассмотрим некоторые алгоритмы работы ядра с файлами. Ниже они приведены чисто схематично и в сильном упрощении. Форматы вызова (и оформление) функций не соответствуют форматам, используемым на самом деле в ядре; верны лишь названия функций. Опущены проверки на корректность, подсчет ссылок на структуры file и inode, блокировка I-узлов и кэш-буферов от одновременного доступа, и многое другое.

Пусть мы хотим открыть файл для чтения и прочитать из него некоторую информацию. Вызовы открытия и закрытия файла имеют схему (часть ее будет объяснена позже):

#include <sys/types.h>

#include <sys/inode.h>

#include <sys/file.h>

int fd_read = open(имяФайла, O_RDONLY){

int fd; struct inode *ip; struct file *fp; dev_t dev;

u_error = 0; /* errno в программе */ // Найти файл по имени. Создается копия I-узла в памяти: ip = namei(имяФайла, LOOKUP); // namei может выдать ошибку, если нет такого файла if(u_error) return(-1); // ошибка

// Выделяется структура "открытый файл": fp = falloc(ip, FREAD); // fp->f_flag = FREAD; открыт на чтение // fp->f_offset = 0; RWptr // fp->f_inode = ip; ссылка на I-узел

// Выделить новый дескриптор for(fd=0; fd < NOFILE; fd++) if(u_ofile[fd] == NULL ) // свободен goto done; u_error = EMFILE; return (-1); done: u_ofile[fd] = fp;

// Если это устройство - инициализировать его. // Это функция openi(ip, fp->f_flag); dev = ip->i_rdev; if((ip->i_mode & IFMT) == IFCHR) (*cdevsw[major(dev)].d_open)(minor(dev),fp->f_flag); else if((ip->i_mode & IFMT) == IFBLK) (*bdevsw[major(dev)].d_open)(minor(dev),fp->f_flag); return fd; // через u_rval1

}

close(fd){ struct file *fp = u_ofile[fd]; struct inode *ip = fp->f_inode; dev_t dev = ip->i_rdev;




Содержание  Назад  Вперед