Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PR_СП_лекции_укр.doc
Скачиваний:
6
Добавлен:
22.04.2019
Размер:
697.34 Кб
Скачать

2.2.2 Системний виклик create

Виклик creat - це просто різновид виклику open у формі

fd = open(имя_файла, O_WRONLY|O_TRUNC|O_CREAT,

коды_доступа);

creat — створює новий або очищає існуючий файл і відкриває його на запис

#include <sys/stat.h>

#include <sys/types.h>

#include <fcntl.h>

int creat(const char *path, mode_t perms)

path - повне ім'я файлу

perms - права доступу

Повертає дескриптор файлу або -1 у разі помилки

(код помилки знаходиться в глобальній змінній errno)

При зверненні до системного виклику open для відкриття існуючого файлу, можна указувати тільки перший і другий аргументи (path і flags). Системний виклик creat використовує тільки перший і третій аргументи.

Знов створеному файлу призначаються ідентифікатор користувача-власника і ідентифікатор групи-власника. Правила призначення власника і групи:

  • власник файлу рівний ефективному ідентифікатору користувача процесу.

  • група рівна або ідентифікатор групи каталога, в якому створюється файл, або ефективному ідентифікатору групи процесу.

У додатку немає можливості вибрати, яка з двох груп буде привласнена файлу, але воно може дізнатися результат за допомогою системного виклику stat. Щоб примусово призначити файлу потрібну групу, можна скористатися системним викликом chgrp.

2.2.3 Системний виклик close

close — закриває дескриптор файлу #include <unistd.h>

#include <unitd.h>

int close(int fd)

fd - дескриптор файлу

Повертає 0 у разі успіху -1 у разі помилки

(код помилки -в змінної errno)

Найважливіше, що потрібно знати про системний виклик close, це те, що він практично нічого не робить. Він не виштовхує на диск вміст буферів ядра - він просто звільняє дескриптор файлу для повторного використання. Коли закривається останній дескриптор, що посилається на запис в таблиці файлів, цей запис також може бути видалена. У свою чергу, коли віддаляється останній запис в таблиці файлів, що посилається на копію індексного вузла в пам'яті, вона також може бути видалена. І ще один момент: якщо лічильник посилань даного індексного вузла виявився рівним 0, то з диска віддаляється індексний вузол і всі пов'язані з ним дані.

Фактично, закривати дескриптори файлів зовсім необов'язково, оскільки вони автоматично утилізують після закінчення процесу. Проте всі структури ядра краще звільняти своєчасно, а в текст програми додавати коментар, який повідомлятиме про закінчення роботи з файлом. Це допоможе вам під час відладки і запобіжить використанню дескриптора файлу помилково.

2.3 Читання та зипис в файл

2.3.1 Системний виклик read

read — виконує читання з файлового дескриптора

#include <unistd.h>

#include <sys/types>

ssize_t read(int fd, void *buf, size_t nbytes)

fd- дескриптор файлу

*buf - адреса буфера для даних, що приймаються

nbytes - об'єм даних, що приймаються

Повертає кількість прочитаних байт або -1 у разі помилки(код помилки - в змінній errno)

Системний виклик read прочитує nbytes байт з файлу, представленого дескриптором fd, і розміщує їх в буфері buf. Читання починається з поточної позиції у файлі, після закінчення читання поточна позиція зміщується на кількість прочитаних байт. У зухвалу програму повертається число прочитаних байт, 0 (після досягнення кінця файлу), або -1, як ознака помилки.

На відміну від write, виклик read не має таких широких можливостей в «обмані» Він не може спочатку передати дані зухвалому процесу, а потім прочитати їх з диска. Якщо в кеші немає необхідних даних (що можливо потрапили туди в результаті інших операцій введення-виводу), то процес вимушений чекати, поки ядро прочитає їх з диска. Іноді ядро прочитує з диска дані, що не тільки зажадалися, а відразу декілька сусідніх блоків, намагаючись у такий спосіб передбачити потреби програми і підвищити швидкість читання даних з файлу. Якщо система працює з невеликим навантаженням, дані можуть зберігатися в буферах достатньо довго і часто виконується читання сусідніх блоків даних, то такий прийом випереджаючого читання дає істотний виграш.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]