- •Введення
- •1. Структура та обсяг дисципліни
- •2. Основи програмування на мові с
- •2.1 Найпростіші конструкції мови
- •2.2 Типи даних
- •2.4 Операції мови с
- •2.5 Структура простої с програми
- •2.6 Організація введення-виведення
- •2.7 Компіляція в системі Linux
- •2.8 Організація розгалужень в програмі
- •2.9 Організація циклів
- •2.10 Оператор break
- •2.11 Оператор continue
- •2.11 Масиви
- •2.12 Функції
- •2.13 Вызов функции с переменным числом параметров
- •2.14 Рекурсивні функції
- •2.15 Читання і запис текстових файлів
- •2.16 Структури даних
- •2.17 Перелік|перерахування| (enumeration)
- •2.18 Об'єднання (union)
- •3. Операційні системи і системне програмування
- •3.1. Поняття операційної системи
- •4. Корисні команди Linux
- •4.1. Загальні|спільні| команди
- •4.1.1. Команда arch – виведення архітектури комп'ютера
- •4.1.2. Команда clear – очищення екрану
- •4.1.3. Команда date
- •4.1.9. Команда uptime – інформація про роботу системи
- •4.1.10. Команда users – інформація про користувачів
- •4.1.11. Команди w, who і whoami інформація про користувачів
- •4.1.12. Команда xf8config – настройка графічної підсистеми
- •4.2. Команди для роботи з текстом
- •4.2.1. Команди diff і cmp
- •4.2.2. Команди grep і egrep – текстовий фільтр
- •4.2.3. Команди more и less – посторінкове виведення
- •4.2.4. Команди head і tail – виведення начала і хвоста файлу
- •4.2.5. Команда wc – підрахунок слів у файлі
- •5. Захист інформації в інформаційних системах
- •5.1 Основні завдання забезпечення безпеки
- •5.2 Базові поняття криптографії
- •5.2.1 Поняття криптографічного алгоритму і протоколу
- •5.2.2 Криптосистеми з секретним ключем
- •5.2.3 Криптосистеми із відкритим ключем
- •5.2.4. Гибридні криптосистеми
- •5.2.5. Цифрові підписи
- •5.2.6. Сертифікати
- •5.3. Принципи аутентифіекації і керування доступом
- •5.3.1. Основи аутентифікації
- •5.3.2. Основи керування доступом
- •5.4. Аутентифікація та керування доступом в unix
- •5.4.1. Облікові записи користувачів
- •5.4.2. Аутентифікація
- •5.4.3. Керування доступом
- •6. Програмний інтерфейс unix. Системні виклики і функції стандартних бібліотек
- •6.1. Підтримка програмування в oc unix. Вивчення передачі інформації
- •6.2. Змінні оточення
- •6.3. Обробка помилок
- •6.4. Правила формування і засоби розбору командних рядків
- •7. Операції над файлами
- •7.1 Файлові операції posix
- •7.2. Збирання інформації про атрибути файла
- •7.3. Операції над каталогами
- •Література
7.2. Збирання інформації про атрибути файла
Кожен файл має набір характеристик –атрибутів. Набір атрибутів змінюється залежно від файлової системи. Найпоширеніші атрибути файла це:
ім’я файла;
тип файла, який звичайно задають для спеціальнх файлів (каталогів, зв’язків тощо);
розмір файла (зазвичай для файла можна визничити його поточний,а іноді й максимальний розмір)ж
атрибути безпеки, що визначають правав доступу до цього файла;
часові атрибути, до яких еалежить час створення, останньої модифікації та останнього використання файла.
Для отримання інформації про атрибути файла(тобто про вміст його індексного дескриптора) використовують системний виклик stat():
#include<sys/stat.h>
int stat(const char *path,struct stat *attrs);
У разі успіху повертає 0 і заповнює поля структури атрибутами файла, в протилежному випадку повертає -1.
Першим параметром є шлях до файла, другим – структура, у яку записуватимуться атрибути внаслідок виклику. Деякі поля цієї структури (всі цілочислові) наведено нижче:
st_mode – тип і режим файла(бітова маска прапорців, зокрема прапорець S_ISDIR встановлюють для каталогів). У цьому полі міститься код доступу до файлу. У старшому біті поля закодований тип файлу. Його можна дізнатися за допомогою макросів, наприклад S_ISDIR.
st_nlink – кількість жорстких зв’язків;
st_size – розміп файла у байтах;
st_aime, st_mtime, st_ctime – час останнього доступу, модифікації та зміни атрибутів (у секундах з 1 січня 1970 року).
Ось приклад відображення інформації про атрибути файла:
struct stat attrs;
stat(“myfile”,&attrs);
if(attrs.st_mode&S_ISDIR)
printf(“myfile є каталогом \n”);
else
printf(“Розмір файла: %d \n”,attrs.st_size);
Для отримання такої самої інформації з дескриптора відкритого файла використовують виклик fstat():
int fstat(int fd1,struct stat *attrs);
Приклад|зразок| програми, в якій перевіряється, чи має власник право запису у файл.
#include<stdio.h>
#include<sys/stat.h>
int main(int argc, char *argv[])
{
const char *const filename=argv[1];
struct stat buf;
stat(filename,&buf);
if(buf,st_mode & S_IWUSR)
printf(“Owning user can write `%s`. \n”,filename);
return 0;
}
Константи визначають:
S_IWUSR – позначає|значить| право запису для власника;
S_IRGRP - позначає|значить| право читання для групи;
S_IXOTH – право виконання решти користувачів.
7.3. Операції над каталогами
Розглянемо базові операції над каталогами.
Створення нового каталогу. Ця операція створює новий каталог. Він звичайно порожній, деякі реалізації додають до нього . і ..
Вилучення каталогу. На рівні систеного виклику ця операція дозволена тільки для порожніх каталогів.
Відкриття і закриття каталогів. Каталог, подібно до звичайного файлу, має бути відкритим перед використанням і закритим після. Деякі операції, пов’язані з доступом до елементів, доступні тільки для відкритих каталогів.
Читання елемента каталогу. Ця операція зчитує один елемент каталогу і переміщує поточну позицію на наступний елемент. Використовуючи читання елемента каталогу в циклі, можна обійти весь каталог.
Перехід у початок каталогу. Ця операція переміщує позицію до першого елемента каталогу.
Для створення каталогу використовують виклик mkdir(), що приймає як параметр шлях до каталогу і режим.
if(mkdir(“./newdir”,0644)==-1)
printf(“Помилка під час створення каталогу. \n”);
Відкривають каталог викликом opendir(), що приймає як параметр ім’я каталогу:
DIR *opendir(const char *dirname);
Під час виконання opendir() ініціалізується внутрішній покажчик поточного елемента каталогу. Цей виклик повертає дескриптор каталогу – покажчик на структуру типу DIR, що буде використана під час обходу каталогу. У разі помилки повертає NULL.
Для читання елемента каталогу і переміщення внутрішнього покажчика поточного елемента використовують виклик readdir():
struct dirent *readdir((DIR *dirp);
Цей виклик повертає покажчик на структуру dirent, що описує елемент каталогу ( із полем d_name, яке містить ім’я елемента) або NULL, якщо елементів більше немає.
Після закінчення пошуку потрібно закрити каталог за допомогою виклику closedir(). Якщо необхідно перейти до першого елемента каталогу без його закриття, використовують виклик rewinddir(). Обидва ці виклики приймають як параметр дескриптор каталогу.
Наведемо приклад обходу каталогу в POSIX:
DIR *dirp;
struct dirent *dp;
dirp=opendir(“./dir”);
if(!dirp())
{
printf(“ помилка під час відкриття каталогу \n”);
exit(-1);
}
while(dp=readdir(dirp))
{
printf(“%s \n”,dp->d_name); // відображення імені елемента
}
closedir(dirp);
