![Page 1: Системни примитиви на файловата система Работа с обикновени файлове](https://reader030.vdocuments.mx/reader030/viewer/2022033017/56813a03550346895da1cd00/html5/thumbnails/1.jpg)
Операционни системи, М. Филипова 1
Системни примитиви на файловата система
Работа с обикновени файлове
гл. ас. Моника ФилиповаФМИ, Катедра Изчислителни системи
![Page 2: Системни примитиви на файловата система Работа с обикновени файлове](https://reader030.vdocuments.mx/reader030/viewer/2022033017/56813a03550346895da1cd00/html5/thumbnails/2.jpg)
Операционни системи, М. Филипова 2
Системни примитиви Обработка на грешки При успех функцията на системния примитив връща цяло
неотрицателно число. При грешка функцията на системния примитив връща -1 и
променливата errno съдържа код на грешката. Кодове на грешки и символни константи за тях
#include <errno.h> Библиотечни функции
#include <stdio.h>void perror(const char *s); int fprintf(FILE *stream, char *frm ...);
Примитивни системни типове данни#include <sys/types.h>
![Page 3: Системни примитиви на файловата система Работа с обикновени файлове](https://reader030.vdocuments.mx/reader030/viewer/2022033017/56813a03550346895da1cd00/html5/thumbnails/3.jpg)
Операционни системи, М. Филипова 3
Съдържание
Основни понятия Системни таблици Системни примитиви за обикновени файлове
Създаване на файл Отваряне на файл Затваряне на файл Четене и писане във файл Позициониране във файл Информация за файл Копиране на файлов дескриптор
Неделимост на операциите
![Page 4: Системни примитиви на файловата система Работа с обикновени файлове](https://reader030.vdocuments.mx/reader030/viewer/2022033017/56813a03550346895da1cd00/html5/thumbnails/4.jpg)
Операционни системи, М. Филипова 4
Основни понятия
Файлов дескриптор (file descriptor) Цяло неотрицателно число, което се свързва с файл при
отваряне и се използва за идентифицирането му. Файловите дескриптори имат локално значение за всеки
процес. Връзката между файловия дескриптор и файла се разрушава
при затваряне на файла.
Текуща позиция във файла (file offset, file pointer) Определя позицията във файла, от която ще бъде четено или
записвано със системните примитиви read и write.
Режим на отваряне на файла Определя начина на достъп до файла чрез съответния файлов
дескриптор докато е отворен от процеса.
![Page 5: Системни примитиви на файловата система Работа с обикновени файлове](https://reader030.vdocuments.mx/reader030/viewer/2022033017/56813a03550346895da1cd00/html5/thumbnails/5.jpg)
Операционни системи, М. Филипова 5
Системни таблициТаблица на индексните описатели
Съдържа точно един запис за всеки отворен файл. копие на i-node на файла от диска адрес на i-node състояние на i-node брояч
Таблица на отворените файловеВсеки запис съдържа данни за едно отваряне на файл.
режим на отваряне текуща позиция във файла указател към запис от таблицата на индексните
описатели брояч
![Page 6: Системни примитиви на файловата система Работа с обикновени файлове](https://reader030.vdocuments.mx/reader030/viewer/2022033017/56813a03550346895da1cd00/html5/thumbnails/6.jpg)
Операционни системи, М. Филипова 6
Системни таблици (2)
Таблици на файловите дескриптори Всеки процес има собствена Таблица на файловите
дескриптори. Запис в Таблицата съдържа указател към запис от
Таблицата на отворените файлове. Файловият дескриптор представлява индекс на записа
от Таблицата на файловите дескриптори, който е използван при отварянето на файла.
![Page 7: Системни примитиви на файловата система Работа с обикновени файлове](https://reader030.vdocuments.mx/reader030/viewer/2022033017/56813a03550346895da1cd00/html5/thumbnails/7.jpg)
Операционни системи, М. Филипова 7
Системни таблици (3)
1 0
2 3
1 0
2 3
1 0 r
Таблици на файловите
дескриптори
Таблица на отворените
файлове
Таблица на индексните
описатели
4
4
0 1 w
1
1
0
0 rw
r
3
1
i-node на /usr/share
i-node на private
Процес A
Процес B
![Page 8: Системни примитиви на файловата система Работа с обикновени файлове](https://reader030.vdocuments.mx/reader030/viewer/2022033017/56813a03550346895da1cd00/html5/thumbnails/8.jpg)
Операционни системи, М. Филипова 8
Отваряне на файл#include <fcntl.h>int open(const char *filename,
int oflag [, mode_t mode]);
O_RDONLY, O_WRONLY, O_RDWRO_CREAT, O_EXCL, O_TRUNCO_APPEND, O_SYNC
Връщат файлов дескриптор на отворения файл, -1 при грешка.
fd=open(fname,O_WRONLY|O_CREAT|O_TRUNC,mode);
Системни примитиви за обикновени файлове
Създаване на обикновен файлint creat(const char *filename,
mode_t mode);
![Page 9: Системни примитиви на файловата система Работа с обикновени файлове](https://reader030.vdocuments.mx/reader030/viewer/2022033017/56813a03550346895da1cd00/html5/thumbnails/9.jpg)
Операционни системи, М. Филипова 9
Алгоритъм на open1. Преобразува пълното име на файла в номер на i-node.2. Ако файлът съществува и са зададени флагове O_CREAT и
O_EXCL, завършва и връща -1.3. Ако файлът не съществува и е зададен флаг O_CREAT, създава
файл с име filename, в противен случай завършва и връща -1.4. Зарежда i-node на файла в Таблицата на индексните описатели.5. Проверява правата на процеса за достъп към файла.6. Разпределя свободен запис от Таблицата на отворените файлове
и го инициализира: брояч - 1; текуща позиция - 0; режим на отваряне - от oflag; указател към записа от Таблицата на индексните описатели от стъпка 4.
7. Разпределя свободен запис от Таблицата на файловите дескриптори и го инициализира с указател към записа от Таблицата на отворените файлове от стъпка 6.
8. Ако е зададен флаг O_TRUNC, то се освобождават блоковете на файла.
9. Връща файловия дескриптор.
![Page 10: Системни примитиви на файловата система Работа с обикновени файлове](https://reader030.vdocuments.mx/reader030/viewer/2022033017/56813a03550346895da1cd00/html5/thumbnails/10.jpg)
Операционни системи, М. Филипова 10
1 0
2 3
1 0
2 3
1 0 r
Таблици на файловите
дескриптори
Таблица на отворените
файлове
Таблица на индексните
описатели
4
4
0 1 w
1
1
0
0 rw
r
3
1
i-node на /usr/share
i-node на private
Процес A
Процес B
Процес A
fd1=open(“/usr/share”, O_RDONLY);
fd2=open(“/usr/share”, O_WRONLY);
Процес B
fd1=open(“/usr/share”, O_RDONLY);
fd2=open(“private”, O_RDWR);
![Page 11: Системни примитиви на файловата система Работа с обикновени файлове](https://reader030.vdocuments.mx/reader030/viewer/2022033017/56813a03550346895da1cd00/html5/thumbnails/11.jpg)
Операционни системи, М. Филипова 11
Затваряне на файлint close(int fd); Връща 0 при успех, -1 при грешка.
Алгоритъм на close1. Освобождава записа от Таблицата на файловите
дескриптори.2. Намалява с 1 полето брояч в записа от Таблицата на
отворените файлове.3. Ако новото значение е по-голямо от 0, то завършва като
връща 0.4. Ако новото значение е 0, то освобождава записа от
Таблицата на отворените файлове.5. Намалява с 1 полето брояч в записа от Таблицата на
индексните описатели.6. Ако новото значение е 0, то записва i-node на диска (ако е
бил изменен).7. Връща 0.
![Page 12: Системни примитиви на файловата система Работа с обикновени файлове](https://reader030.vdocuments.mx/reader030/viewer/2022033017/56813a03550346895da1cd00/html5/thumbnails/12.jpg)
Операционни системи, М. Филипова 12
Процес B
close(fd1);
close(fd2);
10
23
10
23
1 0 r
Таблици на файловитедескриптори
Таблица на отворенитефайлове
Таблица на индекснитеописатели
4
4
01 w
/usr/share
private
0
0
0
2
A
B
Пример
![Page 13: Системни примитиви на файловата система Работа с обикновени файлове](https://reader030.vdocuments.mx/reader030/viewer/2022033017/56813a03550346895da1cd00/html5/thumbnails/13.jpg)
Операционни системи, М. Филипова 13
Четене и писане във файлssize_t read(int fd, void *buffer,
size_t nbytes);Връща действителния брой прочетени байта, 0 при EOF, -1 при грешка.
ssize_t write(int fd, void *buffer, size_t nbytes);
Връща действителния брой записани байта, -1 при грешка.
Позициониране във файлoff_t lseek(int fd, off_t offset,
int flag);SEEK_SET (0) fp = offsetSEEK_CUR (1) fp = fp + offsetSEEK_END (2) fp = file_size + offset
Връща новото значение на текущата позиция, -1 при грешка.
![Page 14: Системни примитиви на файловата система Работа с обикновени файлове](https://reader030.vdocuments.mx/reader030/viewer/2022033017/56813a03550346895da1cd00/html5/thumbnails/14.jpg)
Операционни системи, М. Филипова 14
#include <stdio.h>#include <fcntl.h>char buf1[] = "ABCDEF";char buf2[] = "abcdef";main(void){ int fd; if (( fd = creat("file.hole", 0640) ) == -1) { fprintf(stderr, "can't create\n"); exit(1); } if (write(fd, buf1, 6) != 6) { fprintf(stderr, "write buf1 error\n"); exit(1); } if (lseek(fd, 10, SEEK_CUR) == -1) { fprintf(stderr, "lseek error\n"); exit(1); } if (write(fd, buf2, 6) != 6) { fprintf(stderr, "write buf2 error\n"); exit(1); } close(fd); exit(0);}
Пример. Създава на "файл с дупка".
![Page 15: Системни примитиви на файловата система Работа с обикновени файлове](https://reader030.vdocuments.mx/reader030/viewer/2022033017/56813a03550346895da1cd00/html5/thumbnails/15.jpg)
Операционни системи, М. Филипова 15
Резултат от изпълнение на програмата
$ a.out
$ ls -l file.hole
-rw-r----- 1 moni staff 22 Apr 12 05:58 file.hole
$ od -c file.hole
0000000 A B C D E F \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000020 a b c d e f
0000026
Пример Запомняне на текущата позиция във файл Проверка, дали файлът позволява позициониране
off_t position;
position = lseek(fd, 0, SEEK_CUR);
![Page 16: Системни примитиви на файловата система Работа с обикновени файлове](https://reader030.vdocuments.mx/reader030/viewer/2022033017/56813a03550346895da1cd00/html5/thumbnails/16.jpg)
Операционни системи, М. Филипова 16
Информация за файл
#include <sys/stat.h>
int stat(const char *filename, struct stat *sbuf);
int fstat(int fd, struct stat *sbuf);int lstat(const char *filename,
struct stat *sbuf); Връщат 0 при успех, -1 при грешка.
![Page 17: Системни примитиви на файловата система Работа с обикновени файлове](https://reader030.vdocuments.mx/reader030/viewer/2022033017/56813a03550346895da1cd00/html5/thumbnails/17.jpg)
Операционни системи, М. Филипова 17
Структура statstruct stat {
dev_t st_dev; /* device where inode belongs */
ino_t st_ino; /* inode number */
mode_t st_mode; /* mode word */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner*/
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device type for special files */
off_t st_size; /* file size */
blksize_t st_blksize; /* blocksize for filesystem I/O */
blkcnt_t st_blocks; /* number of blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last change */
};
![Page 18: Системни примитиви на файловата система Работа с обикновени файлове](https://reader030.vdocuments.mx/reader030/viewer/2022033017/56813a03550346895da1cd00/html5/thumbnails/18.jpg)
Операционни системи, М. Филипова 18
#include <stdio.h>#include <sys/stat.h>#include <fcntl.h>#define BUFS 4096
main(int argc, char *argv[]){int fdr, fdw, n;struct stat sbuf;char buff[BUFS];
if (argc != 3) {fprintf(stderr, "usage: copy from_file to_file\n");exit(1); }
if ( stat(argv[1], &sbuf) == -1) {fprintf(stderr, "copy: %s: No such file\n", argv[1]);exit(1); }
Пример. Създава ново копие на съществуващ файл.
![Page 19: Системни примитиви на файловата система Работа с обикновени файлове](https://reader030.vdocuments.mx/reader030/viewer/2022033017/56813a03550346895da1cd00/html5/thumbnails/19.jpg)
Операционни системи, М. Филипова 19
if ( ! S_ISREG(sbuf.st_mode) ) {fprintf(stderr, "copy: %s: Not a regular file\n", argv[1]);exit(1); }
if (( fdr = open(argv[1], O_RDONLY)) == -1) {fprintf(stderr, "copy: %s: can't open\n", argv[1]);exit(1); }
if (( fdw = creat(argv[2], 0644)) == -1) {fprintf(stderr, "copy: %s:can't create\n", argv[2]);exit(1); }
while (( n = read(fdr, buff, BUFS)) > 0)write(fdw, buff, n);
close(fdr);close(fdw); exit(0);}
![Page 20: Системни примитиви на файловата система Работа с обикновени файлове](https://reader030.vdocuments.mx/reader030/viewer/2022033017/56813a03550346895da1cd00/html5/thumbnails/20.jpg)
Операционни системи, М. Филипова 20
Общото между двата файлови дескриптора:- един и същи отворен файл- общ указател на текуща позиция- еднакъв режим на отваряне на файла
Копиране на файлов дескрипторint dup(int fd);
int dup2(int fd, int newfd);Връщат новия файлов дескриптор при успех,-1 при грешка.
![Page 21: Системни примитиви на файловата система Работа с обикновени файлове](https://reader030.vdocuments.mx/reader030/viewer/2022033017/56813a03550346895da1cd00/html5/thumbnails/21.jpg)
Операционни системи, М. Филипова 21
fd1=open("/usr/share", O_RDONLY);fd2=open("/usr/share", O_WRONLY);fd3=dup(fd1);
10
23
0 r
Таблици на файловитедескриптори
Таблица на отворенитефайлове
Таблица на индекснитеописатели
401 w
/usr/share5
2
2
![Page 22: Системни примитиви на файловата система Работа с обикновени файлове](https://reader030.vdocuments.mx/reader030/viewer/2022033017/56813a03550346895da1cd00/html5/thumbnails/22.jpg)
Операционни системи, М. Филипова 22
Пример. Пренасочване на стандартния вход от файл
if ( (fd = open(infile, O_RDONLY)) == -1 ) {
fprintf(stderr, "can't open file %s\n", infile);
exit(1); }
close(0);
dup(fd);
close(fd);
![Page 23: Системни примитиви на файловата система Работа с обикновени файлове](https://reader030.vdocuments.mx/reader030/viewer/2022033017/56813a03550346895da1cd00/html5/thumbnails/23.jpg)
Операционни системи, М. Филипова 23
Неделимост на операциите Ядрото гарантира неделимост (атомарност) за
всеки отделен системен примитив.
Пример. Позициониране в края на файл и писане Първи вариант
fd = open("/home/share", O_WRONLY);
lseek(fd, 0, SEEK_END); /* position to EOF */
write(fd, buf, 10); /* and write */
Втори вариант
fd = open("/home/share", O_WRONLY |O_APPEND);
write(fd, buf, 10); /* position to EOF and write */
![Page 24: Системни примитиви на файловата система Работа с обикновени файлове](https://reader030.vdocuments.mx/reader030/viewer/2022033017/56813a03550346895da1cd00/html5/thumbnails/24.jpg)
Операционни системи, М. Филипова 24
Пример. Извежда на стандартния изход съдържанието на файлове, чиито имена са зададени като аргументи.
#include <stdio.h>#include <fcntl.h>#include <sys/stat.h>
main(int argc, char *argv[]){int fdr, i;struct stat sbuf;char buff;
if (argc < 2) { fprintf(stderr,"usage: typef file...\n"); exit(1); }
![Page 25: Системни примитиви на файловата система Работа с обикновени файлове](https://reader030.vdocuments.mx/reader030/viewer/2022033017/56813a03550346895da1cd00/html5/thumbnails/25.jpg)
Операционни системи, М. Филипова 25
for ( i=1; i<argc; i++ ) { if ( stat(argv[i], &sbuf) ==-1) { fprintf(stderr,"typef: %s: No such file\n", argv[i]); continue; } if ( ! S_ISREG(sbuf.st_mode) ) { fprintf(stderr,"typef: %s: is not a regular file\n", argv[i]); continue; } if (( fdr = open(argv[i], O_RDONLY) ) == -1) { fprintf(stderr, "typef: %s: can't open\n", argv[i]); continue; }
while ( read(fdr, &buf, 1) ) write(1, &buf, 1); close(fdr); } exit(0);}