- •Міністерство освіти і науки України
- •Жуковецька с.Л., Шестопалов с.В.
- •Анотація
- •Введення
- •Лабораторна робота №1 Технологія розробки програм у середовищі Linux
- •1. Команди роботи з командним інтерпретатором ос unix
- •2. Створення програми
- •3. Функції введення-виведення.
- •4. Приклад програми
- •5. Основні керуючі конструкції мови с
- •6. Індівідуальні завдання
- •Лабораторна робота № 2. Автоматизація пакетних завдань
- •1. Компіляція багатомодульною програми
- •2. Автоматизація пакетних завдань
- •4. Завдання
- •Лабораторна робота № 3. Взаємодія програми з середовищем виконання
- •1. Аргументи командного рядка
- •2. Змінні оточення
- •3. Індівідуальні завдання
- •Лабораторна робота №4. Контроль виконання програми
- •1. Коди завершення програми
- •2. Функції обробки значення errno
- •3. Функція atexit()
- •4. Макрос asssert()
- •5. Індівідуальні завдання
- •Лабораторна робота №5 Файлові api.
- •1 Основні поняття
- •2. Права доступу до файлів
- •3. Інтерфейси для файлового введення / виводу
- •4. Системні виклики роботи з файлами
- •5. Індівідуальні завдання
- •Варіанти завдань
- •Лабораторна робота №6 Робота з каталогами та посиланнями
- •Методичні вказівки
- •1. Створення та видалення каталогу
- •2. Читання каталогу
- •3. Зміна каталогу
- •4. Управління жорсткими посиланнями
- •5. Управління символічними посиланнями
- •6. Перейменування файлів і каталогів
- •7. Індівідуальні завдання
- •Лабораторна робота №7. Одержання і відображення метаданих файлу.
- •Методичні вказівки
- •1. Механізми управління файлами ос unix
- •2. Отримання даних індексного дескриптору
- •3. Додаткові функції маніпулювання даними індексних дескрипторів
- •4. Отримання даних про відкриті файли
- •5. Індівідуальні завдання
- •Лабораторна робота №8. Керування процесами
- •Методичні вказівки
- •1. Загальні поняття
- •2. Створення поцесу
- •4. Перезавантаження програми процесу
- •5. Завершення виконання процесу
- •6. Системні виклики wait, waitpid
- •7. Індівідуальні завдання
- •Лабораторна робота №9. Використання каналів
- •Методичні вказівки
- •1. Заганьні відомості
- •2. Використання каналів
- •3. Індівідуальні завдання
- •Варіанти завдань
- •Лабораторна робота №10 Використання повідомлень
- •Методичні вказівки
- •1. Загальні відомості
- •2. Використання повідомлень
- •3. Індівідуальні завдання
- •Література
- •Системне програмування Посібник до виконання лабораторних та самостійних робіт
- •65082, Одеса, вул. Дворянська, 1/3
4. Системні виклики роботи з файлами
При програмуванні операцій з файлами мовою Си використовуються бібліотечні виклики мови орієнтовані в першу чергу на операційну систему Unix (для якої мова й розроблявся).
Прототипи необхідних для роботи з файлами функцій, використовувані при цьому типи й константи описані в заголовних файлах:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
Для роботи з файлами використовуються наступні функції.
Відкриття файлу виконується по функції
int open(const char *path, int flags, mode_t mode);
де перший параметр задає ім'я файлу, другий параметр показує, які види доступу до файлу дозволені зухвалому процесу.
Параметр flags може приймати наступні значення:
O_RDONLY - відкриття файлу тільки для читання;
O_WRONLY - відкриття файлу тільки для запису;
O_RDWR - відкриття файлу для читання й запису.
Значення параметра може логічно складатися з модифікаторми:
O_APPEND - дані додаються в кінець файлу;
O_CREAT - створюється файл, якщо він не існує;
O_TRUNC - якщо файл існує, то його вміст губиться, а розмір
установлюється рівним 0;
O_EXCL - використовується разом із прапором O_CREAT, у
цьому випадку спроба створити файл, якщо він уже
існує, кінчається невдачею.
Параметр mode установлює атрибути прав доступу різних категорій користувачів до нового файлу при його створенні. Він обов'язковий, якщо серед заданих прапорів присутній прапор O_CREAT, і може бути опущений у противному випадку. Цей параметр задається як сума наступних восьмеричних значень:
0400 - дозволене читання для користувача, що створив файл;
0200 - дозволений запис для користувача, що створив файл;
0100 - дозволене виконання для користувача, що створив файл;
0040 - дозволене читання для групи користувача, що створив файл;
0020 - дозволений запис для групи користувача, що створив файл;
0010 - дозволене виконання для групи користувача, що створив файл;
0004 - дозволене читання для всіх інших користувачів;
0002 - дозволений запис для всіх інших користувачів;
0001 - дозволене виконання для всіх інших користувачів.
У стандарті POSIX Ці коди мають ще й мнемонічні імена (використовувані у виклику stat):
Принцип їхнього іменування треба шаблону S_Ipwww, де p визначає режим доступу (R, w або X), a www — кому видається право на цей режим доступу (USR, GRP або OTH).
Наприклад, для восьмеричного числа 755 можна записати:
S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH
Існують окремі ідентифікатори для USR, GRP і OTH, які описують повні права доступу. Іменування цих ідентифікаторів треба формі S_IRWXw. Тут символ w визначає, кому видається повне право доступу до файлу (від англ, «whom» - «кому») - U, G або О. Таким чином, що предыдет приклад може бути записаний у наступному виді:
S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH
Використання ідентифікаторів дає розроблювачам ОС волю вибору порядку проходження біт, що описують права доступу до файлу.
mode завжди повинен бути зазначений при використанні O_CREAT, у всіх інших випадках цей параметр ігнорується.
При створенні файлу реально встановлюваного права доступу виходять зі стандартної комбінації параметра mode і маски створення файлів поточного процесу umask, а саме - вони рівні mode & umask.
Маска звичайно встановлюється під час реєстрації користувача в системі (командою umask) або системним викликом umask. Фраза «логічне множення на логічне доповнення» означає: якщо якийсь біт маски встановлений, те відповідний йому біт в остаточному наборі прав доступу скидається.
Після успішного відкриття файлу функція повертає значення дескриптора файлу.
Створення файлу.
Виклик creat - це просто різновид виклику open у формі
d=open(ім'я_файлу,O_WRONLY|O_TRUNC|O_CREAT,mode);
creat - створює новий або очищає існуючий файл і відкриває його на запис
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
int creat(const char *path, mode_t perms)
path - повне ім'я файлу
perms - права доступу
Повертає дескриптор файлу або -1 у випадку помилки
Читання даних виконується з використанням функцій з бібліотеки мови Си. Зокрема, для читання можна використовувати функцію:
ssize_t read(int fdes, char *buf, size_t count);
Запис у файл може виконуватися по функції:
ssize_t write(int fdes, char *buf, size_t count);
Як перший параметр використовується дескриптор файлу. Другий параметр указує на буфер обміну. Третій параметр - довжина буфера. При нормальному завершенні повертається значение, що, повинне збігатися зі значенням третього параметра.
Закривається файл функцією
int close(int fdes);
аргументом функції є дескриптор відповідного файлу.
Позіціонуваня у файлі
Системний виклик lseek використовується для переустановлення поточної позиції у файлі. Він не виконує ніяких операцій введення-виводу і не віддає команд контроллеру диска.
#include <sys/types.h>
#include <unistd.h>
off_t lseek( int fd, off_t offset, int whence );
fd - дескриптор файлу
pos - позиція у файлі
whence - інтерпретація аргументу pos
Повертає нову позицію у файлі або -1 у разі помилки (код помилки в змінній errno)
Аргумент whence може приймати одне з наступних значень:
SEEK_SET Аргумент pos містить зсув від початку файлу (абсолютна позиція у файлі).
SEEK_CUR Аргумент pos містить зсув від поточної позиції у файлі. Може бути позитивним числом, нулем і негативним числом. Вказавши в аргументі pos значення 0 — ми отримаємо поточну позицію у файлі.
SEEK_ENO Аргумент pos містить зсув від кінця файлу. Може бути позитивним числом, нулем і негативним числом. Вказавши в аргументі pos значення 0 — ми встановимо поточну позицію в кінець файлу.
Результатом роботи виклику може бути будь-яке ненегативне число, що навіть перевищує розмір файлу. Якщо нова поточна позиція опинилася за межами файлу, то найближчий виклик write вставить «бракуючий» шматок в кінець файлу і заповнить його байтами із значенням 0. Виклик read, з поточною позицією встановленою в кінець файлу або за його межами, поверне ознаку кінця файлу — 0. Спроба читання з інтервалу, який заповнив виклик write при вставці «бракуючого» шматка, увінчається успіхом і в зухвалу програму буде повернений буфер, заповнений нулями, як того і слід було чекати.
Приклад - копіювання даних з одного файлу в новий файл.
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
int main() {
int fdIn; //Вхідний файл
int fdOut; //Вихідний файл
char buf[256]; //Буфер обміну
char InName[20], OutName[20]; //Імена файлів
ssize_t nRd;
// Уведення імен вхідного й вихідного файлів
printf("Ім'я вхідного файлу -> ");
gets(InName);
printf("Ім'я вихідного файлу -> ");
gets(OutName);
// Відкриття файлів
if((fdIn=open(InName, O_RDONLY))==-1)
{perror("Помилка відкриття вхідного файлу"); exit(-1);}
if((fdOut=open(OutName, O_WRONLY|O_CREAT,644))==-1)
{ perror("Помилка відкриття вихідного файлу"); close(fdIn);
exit(-2); }
// Цикл копіювання
while((nRd=read(fdIn, buf, 256))>0)
{ if(write(fdOut, buf, nRd)<nRd)
{ perror("Помилка запису"); close(fdIn); close(fdOut); exit(-3); }
}
close(fdIn); close(fdOut);
printf("Завершення програми\n"); exit(0);
}
При відкритті вхідного файлу задається ключ режиму роботи з файлом "тільки для читання" (O_RDONLY). Функція повертає дескриптор відкритого файлу. У випадку помилки вертається -1. Для висновку повідомлення про помилку використовується функція perror(). Ця функція виводить задається їй як аргумент текст. Крім того, функція обробляє системний номер помилки (errno) і додає у виведений рядок системне повідомлення про помилку.
Функція, що відкриває вихідний файл повертає дескриптор вихідного файлу. Ця функція виконується з режимами "тільки для запису" (O_WRONLY) і із ключем створення нового файлу (O_CREAT). Крім цього, при виклику функції використовується третій параметр (644), що визначає права доступу до створюваного файлу (читання й запис для власника й тільки читання для інших користувачів).