Первая страница
Наша команда
Контакты
О нас

    Головна сторінка



“Інформаційні управляючі системи та технології” 080402 “Інформаційні технології проектування” Одеса 2010

“Інформаційні управляючі системи та технології” 080402 “Інформаційні технології проектування” Одеса 2010




Сторінка24/24
Дата конвертації10.03.2017
Розмір1.41 Mb.
1   ...   16   17   18   19   20   21   22   23   24

8. 4. Атрибути файлів


Кожний файл має набір характеристик – атрибутів. Набір атрибутів змінюється залежно від файлової системи. Найпоширеніші атрибути файла наведено нижче.

  • Ім’я файла, докладно розглянуте раніше.

  • Розмір файла (зазвичай для файла можна визначити його поточний, а й іноді максимальний розмір).

  • Тип файла, який звичайно задають для спеціальних файлів (каталогів, зв’язків тощо).

  • Атрибути безпеки, що визначають права доступу до цього файла.

  • Часові атрибути, до яких належить час створення останньої модифікації та останнього використання файла.

Інформацію про атрибути файла також зберігають на диску. Особливості її зберігання залежать від фізичної організації файлової системи.

8. 5. Операції над файлами і каталогами


У цьому розділі вивчати мемо основні операції, які можна виконувати над файлами та каталогами.

8. 5. 1. Підходи до використання файлів процесами


Підходи до використання файлів із процесу бувають такі: зі збереженням (stateful) і без збереження стану (stateless).

У разі збереження стану є спеціальні операції, які готують файл до використання у процесі (відкривають його) і скасовують цю готовність (закривають його).

Спеціальна операція військ (сил) - загальновживане поняття, що набуло широкого вжитку у різних сферах діяльності силових структур та правоохоронних органів світу з другої половини 20 століття.
Інші операції використовують структури даних, підготовлені під час відкриття файла, і можуть виконуватися тільки доти, поки файл не буде закритий. Перевагою такого підхода є висока продуктивність, оскільки під час відкриття файла потрібні структури даних завантажуються у пам’ять.



Якщо стан не зберігають, кожна операція роботи із файлом (читання, записування тощо) супроводжується повною підготовкою файла до роботи (кожна операція починається відкриттям файла і завершується закриттям). Хоча такий підхід програє у продуктивності, його можна використати для підвищення надійності роботи системи за високої ймовірності того, що файлова операція зазнає краху, внаслідок чого структури даних відкритих файлів залишаться в некоректному стані. Так можна робити у випадку, коли файлову систему використовують через мережу, тому що у будь-який момент може статися розрив мережного з’єднання. Далі в цьому розділі буде розглянуто підхід зі збереженням стану.

8. 5. 2. Загальні відомості про файлові операції


Назвемо основні файлові операції, які звичайно надає операційна система для використання у прикладних програмах.

  • Відкриття файла- після закриття файла процес може із ним працювати (наприклад, робити читання і записування). Відкриття файла зазвичай передбачає завантаження в оперативну пам’ять спеціальної структури даних – дескриптора файла, який визначає його атрибути та місце розташування на диску. Наступні виклики використовуватимуть цю структуру для доступу до файла.

  • Закриття файла – після завершення роботи із файлом його треба закрити. При цьому структуру даних, створену під час його відкриття, вилучають із пам’яті. Усі дотепер не збережені зміни записують на диск.

  • Створення файла- ця операція спричиняє створення на диску нового файла нульової довжини. Після створення файл автоматично відкривають.

  • Вилучення файла- ця операція спричиняє вилучення файла і вивільнення зайнятого ним дискового простору. Вона зазвичай недопустима для відкритих файлів. У розділі 8.3 зазначалося про особливості реалізації цієї операції у системі з підтримкою жорстких зв’язків.

  • Читання з файла – ця операція звичайно зводиться до пересилання певної кількості байтів із файла, починаючи із поточної позиції, у заздалегідь виділений для цього буфер пам’яті режиму користувача.

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

  • Переміщення покажчика поточної позиції – перед операціями читання і записування слід визначити, де у файлі перебувають потрібні дані або куди потрібно їх записати, задавши за допомогою цієї операції поточну позицію у файлі. Зазначимо, що якщо перемістити покажчик файла за його кінець, а потім виконати операцію записування, довжина файла збільшиться.

  • Отримання і задання атрибутів файла – ці дві операції дають змогу зчитувати поточні значення всіх або деяких атрибутів файла або задавати для них нові значення.

8. 5. 3. Файлові операції POSIX


Усі Unix-системи реалізують доступ до файлів за допомогою компактного набору системних викликів, визначеного стандартом POSIX, який відповідає набору файлових операцій, наведених у попередньому розділі.

Відкриття і створення файлів

Для відкриття файла використовують системний виклик open() , першим параметром якого є шлях до файла.

#include

int open (const char *pathname , int flags [, mode_t mode]);

Виклик open() повертає цілочислове значення – файловий дескриптор. Його слід використовувати в усіх викликах, яким потрібен відкритий файл. У разі помилки цей виклик поверне -1, а значення змінної errno відповідатиме коду помилки.

Розглянемо деякі значення, яких може набувати параметр flags (їх можна об’єднувати за допомогою побітового „або”):



  • O_RDONLY, O_WRONLY, O_RDWR –відкриття файла, відповідно тільки для читання, тільки для запмсування або для читання і записування (має бути задане одне із цих трьох значень, наведені нижче не обов’язкові);

  • O_CREAT – якщо файл із таким ім’ям відсутній, його буде створено, якщо файл є і увімкнуто прапорець O_EXCL, буде повернено помилку;

  • O_TRUNC – якщо файл відкривають для записування, його довжину покладають рівною нулю;

  • O_NONBLOCK - задає неблокувальне введення-виведення; особливості його використання розглянемо разом із викликом read().

Параметр mode потрібно задавати тільки тоді, коли задано прапорець O_CREAT. Значенням у цьому випадку буде вісімкове число, що задає права доступу до файла. Як аргумент задаватимемо значення 0644, що дає змогу після створення файла записувати в нього дані. Ось приклад використання цього системного виклику:

// відкриття файла для записування

int fdl =open(“./myfile.txt” , O_WRONLY|O_CREAT|O_TRUNC. 0644);

// відкриття файла для читання, помилка, якщо файла немає

int fdl =open(“./myfile.txt” ,O_RDONLY);

Закриття файла

Файл закривають за допомогою системного виклику close(), що приймає файловий дескриптор:

close (fdl);

Читання і записування даних

Для читання даних із відкритого файла використовують системний виклик read ():

ssize_t read(int fdl, void *buf, size_t count);

Внаслідок цього виклику буде прочитано count байтів із файла, заданого відкритим дескриптором fdl, у пам’ять, на яку вказує buf (ця пам’ять виділяється заздалегідь). Виклик read () повертає реальний обсяг прочитаних даних (тип ssize_t є цілочисловим ). Покажчик позиції у файлі пересувають за зчитані дані.

char buf [100];

//читають 100 байт з файлу buf

int bytes_read=read (fdl, buf, sizeof (buf));

Коли потрібна кількість даних у конкретний момент відсутня (наприклад, fdl пов’язаний із мережним з’єднанням, яким ще не прийшли дані ), поведінка цього виклику залежить від значення прапорця O_NONBLOCK під час виклику open().

У разі блокувального виклику (O_NONBLOCK не увімкнуто) він призупинить поточний потік до тих пір, поки дані не з’являться, а в разі неблокувального (O_NONBLOCK увімкнуто) – зчитає усі доступні дані і завершиться, призупинення потоку не відбудеться.

Для записування даних у відкритий файл через файловий дескриптор використовують системний виклик write() :

ssize_t write (int fdl, const void *buf, size_t count);

Внаслідок цього виклику буде записано count байтів у файл через дескриптор fdl із пам’яті, на яку вказує buf . Виклик write() повертає обсяг записаних даних.

int fdl, bytes_written;

fdl=open(“./myfile.txt” , O_RDWR|O_CREAT, 00644 );

bytes_written=write (fdl, “hello”, sizeof(“hello”));

Реалізація копіювання файлів

Наведемо приклад реалізації копіювання файлів за допомогою засобів POSIX.

char buf[1024]; int bytes_read, intfile, outfile;

//відкриття вихідного файла для читання

infile=open(“infile.txt”, O_RDONLY);

if (infile = = 1){

printf (“помилка під час відкриття файла \n”); exit (-1);

}

// створення результуючого файла, перевірку помилок пропущено



outfile=open(“outfile.txt”, O_WRONLY|O_CREAT| O_TRUNC, 0644);

do{


//читання даних із вихідного файла у буфер

bytes_read=read(infile,buf, sizeof (buf));

//записування даних із буфера в результуючий файл

if (bytes_read>0) write(outfile, buf,bytes_read);

} while (bytes_read>0);

//закриття файлів

close(infile);

close(outfile);



Переміщення покажчика поточної позиції у файлі

Кожному відкритому файлу відповідає покажчик позиції (зсув) усередині файла. Його можна пересувати за допомогою системного виклику lseek ():

off_t lseek(int fdl, off_t offset, int whence);

Параметр offset задає величину переміщення покажчика. Режим переміщення задають параметром whence, який може набувати значень SEEK_SET (абсолютне переміщення від початку файла), SEEK_ CUR(відносне переміщення від поточного місця покажчика позиції) і SEEK_END (переміщення від кінця файла).

// переміщення покажчика позиції на 100 байт від поточного місця

lseek (outfile, 100, SEEK_CUR);

//записування у файл

write (outfile, “hello”, sizeof (“hello”));

Коли покажчик поточної позиції перед операцією записування опиняється за кінцем файла, він внаслідок записування автоматично розширюється до потрібної довжини. На цьому грунтується ефективний спосіб створення файлів необхідного розміру:

int fdl=open(“file” , O_RDWR|O_CREAT|O_TRUNC, 0644); // створення файла

lseek(fdl, needed_size, SEEK_SET); //розширення до потрібного розміру

write(fdl, “ ”,1); //записування нульового байта



Збирання інформації про атрибути файла

Для отримання інформації про атрибути файла (тобто про вміст його індексного дескриптора) використовують системний виклик stat ().

#include

int stat(const char *path, struct stat *attrs);

Першим параметром є шлях до файла, другим- структура, у яку записуватимуться атрибути внаслідок виклику. Деякі поля цієї структури (всі цілочислові) наведено нижче:


  • st_mode- тип і режим файла (бітова маска прапорців, зокрема прапорець S_IFDIR встановлюють для каталогів);

  • st_nlink- кількість жорстких зв’язків;

  • st_size –розмір файла у байтах;

  • st_atime, st_mtime, st_ctime – час останнього доступу, модифікації та зміни атрибутів (у секундах з 1 січня1970 року).

Ось приклад відображення інформації про атрибути файла:

struct stat attrs;

stat (“myfile” , &attrs);

if (attrs.st_imode & S_IFDIR)

printf(“myfile є каталогом \n”);

else


printf (“розмір файла: %d\n”, attrs.st_size);

Для отримання такої самої інформації з дескриптора відкритого файла використовують виклик fstat().



int fstat (int fdl, struct stat * attrs);

Література


  1. Э. Таненбаум. Современные операционные системы. 2-е изд.
    СПб.: Питер, 2002М.

  2. А. В. Гордеев, А. Ю. Молчанов. Системное программное обеспечение. Учебник для вузов. –СПб.: Питер, 2003

  3. М. Митчелл, Д. Оулдем, А. Самьюэл. Программирование для UNIX. Профессиональный подход. – ИД «Вильямс», 2004

  4. А. Роббинс. Linux. Программирование в примерах.
    – М.: КУДИЦ-ОБРАЗ, 2005.

  5. Д. Н. Колисниченко. Linux. Установка. Настройка. Использование.
    –СПб.: Наука и Техника, 2004

  6. В. А. Галатенко Программирование в стандарте POSIX: Курс лекций: Учеб. Пособие –М.: Интернет-университет информ. Технологий, 2004.

  7. Н. Ю. Секунов Программирование на С вLinux. –СПб.:БХВ_Петербург, 2004.

  8. А. М. Робачевский Операционная система UNIX. –Спбю: БХВ-Петербург, 2002.

  9. В. А. Шеховцов Операційні системи. –К.: видавнича група BHV,2005

  10. Методичні вказівки до оформлення розрахунково-пояснювальних записок, дипломних і курсових проектів, Ломовцев Б. А.
    Дипло́м (грец. δίπλωµα (diploma) - «складений листок») - офіційний документ про закінчення середнього спеціального або вищого навчального закладу та присвоєння відповідної кваліфікації; також офіційний документ про присвоєння наукового ступеня або звання.
    , Ломовцев П. Б. , Лебедєва Л. В. –Одеса, ОДАХ, 2005.



1   ...   16   17   18   19   20   21   22   23   24



  • 8. 5. Операції над файлами і каталогами
  • 8. 5. 2. Загальні відомості про файлові операції
  • 8. 5. 3. Файлові операції POSIX
  • Література