- •Анотація
- •1 Середовище програмування ос unix
- •1.1 Структура ос unix
- •1.2 Створення програми
- •1. Препроцесор
- •2. Транслятор
- •2.1 Компілятор
- •2.2 Асемблер
- •3. Редактор зв'язків(Компонувальником)
- •1.3 Формати об'єктних файлів
- •2 Використання файлової системи unix
- •2.1 Основні поняття
- •2.1.1 Типи та іменування файлів
- •2.1.2 Права доступу до файлів
- •2.1.3 Cистемные структури керування файлами
- •2.1.4 Системні виклики роботи з файлами
- •2.2 Створення та відкриття файлів
- •2.2.1 Системний виклик open
- •2.2.2 Системний виклик create
- •2.2.3 Системний виклик close
- •2.3 Читання та зипис в файл
- •2.3.1 Системний виклик read
- •2.3.2 Системний виклик write
- •2.4 Позіціонування у файлі
- •2.4.1 Системний виклик lseek
- •2.4.2 Системні виклики pread і pwrite
- •2.4.3 Системні виклики readv і writev
- •2.5 Контрольні операції над файлами
- •2.5.1 Системні виклики stat, fstat і lstat
- •2.5.2 Контроль прав доступу до файлу
- •2.5.3 Функція fcntl
- •2.5.4 Системні виклики truncate і ftruncate
- •2.6 Управління каталогами
- •2.6.1 Створення і видалення
- •2.6.2 Читання каталога
- •2.6.3 Зміна каталога
- •2.7 Управління посиланнями
- •2.7.1 Управління жорсткими посиланнями
- •2.7.2 Управління символічними посиланнями
- •2.7.3 Перейменування файлів і каталогів
- •3 Керування процесами ос unix
- •3.1 Процеси ос unix
- •3.2 Сисвизови створення процесів
- •3.3 Завершення процесу
- •3.4 Взаємодія процесів в ос unix
- •3.5 Сигнали
- •3.5.1 Поняття сигналу
- •3.5.2 Розробка оброблювачів сигналів
- •3.5.3 Генерація сигналів
- •3.5.4 Посилка сигналів іншим процесам
- •3.5.5 Блокування сигналів
- •3.5.6 Очікування сигналу
- •3.6 Трасування процесу.
- •3.7 Канали й fifo-Файли
- •3.7.1 Поняття
- •3.7.2 Створення каналу
- •3.7.3 Створення fifo-Файлів
- •3.8 Семафори
- •3.9 Повідомлення.
- •3.10 Поділювана пам'ять.
- •Література
- •Системне програмування Навчальний посібник
- •65082, Одеса, вул. Дворянська, 1/3
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 не має таких широких можливостей в «обмані» Він не може спочатку передати дані зухвалому процесу, а потім прочитати їх з диска. Якщо в кеші немає необхідних даних (що можливо потрапили туди в результаті інших операцій введення-виводу), то процес вимушений чекати, поки ядро прочитає їх з диска. Іноді ядро прочитує з диска дані, що не тільки зажадалися, а відразу декілька сусідніх блоків, намагаючись у такий спосіб передбачити потреби програми і підвищити швидкість читання даних з файлу. Якщо система працює з невеликим навантаженням, дані можуть зберігатися в буферах достатньо довго і часто виконується читання сусідніх блоків даних, то такий прийом випереджаючого читання дає істотний виграш.