
- •Міністерство освіти і науки України
- •Жуковецька с.Л., Шестопалов с.В.
- •Анотація
- •Введення
- •Лабораторна робота №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
Какую работу нужно написать?
Методичні вказівки
1. Створення та видалення каталогу
mkdir () створює порожній каталог
# Include <sys/types.h>
# include <sys/stat.h>
int mkdir (const char * pathname, mode_t mode);
Return: 0 якщо OK, -1 при помилці
Ця функція створює новий порожній каталог. Елементи точка і точка-точка створюються автоматично. Зазначені права доступу до файлів, mode, модифікується маскою створення файлів процесу. Загальна помилка - вказувати такий самий режим прав як і для файлу (тільки читання і запис). Але для директорія нам треба, принаймні, підняти один біт виконання, щоб отримати доступ до імен файлів всередині директорія.
rmdir () видаляє порожній каталог
# Include <unistd.h>
int rmdir (const char * pathname);
Return: 0, якщо все OK, -1 при помилці
Якщо лічильник посилань на каталог стане рівним нулю разом з цим викликом і ніякий інший процес не відкрив каталог, тоді простір займане каталогом звільняється. Якщо один або більше процесів мають каталог відкритим, коли лічильник посилань досягне 0, віддаляється останнє посилання, видаляються елементи точка і точка-точка перед тим як функція поверне управління. Однак, каталог не звільняється до тих пір поки останній процес не закриє його.
2. Читання каталогу
Каталог може бути прочитаний будь-яким користувачем у кого є права для читання каталогу. Але здійснити запис у каталог може тільки ядро (для збереження працездатності файлової системи).
Стандартна бібліотека Linux надає два способи перерахування вмісту директорій:
перший - за допомогою функції scandir () і функцій зворотного виклику,
int scandir (const char * dir, struct dirent *** namelist,
int (* select) (const struct dirent *),
int ( * compar) (const struct dirent **, const struct dirent **));
Як функції сортування запропоновані alphasort () і versionsort (), а ось фільтр, так розумію, потрібно писати свій.
другий - з використанням набору функцій opendir (), readdir (), closedir ().
# Include <sys/types.h>
# include <dirent.h>
DIR * opendir (const char * pathname);
Return: покажчик, якщо все OK, NULL при помилку
struct dirent * readdir (DIR * dp);
Return: покажчик, якщо все OK, NULL якщо кінець каталогу або помилка
void rewinddir (DIR * dp);
int closedir (DIR * dp);
Return: 0, якщо все OK, -1 при помилці
Структура dirent визначена у файлі <dirent.h> і є залежною від реалізації. Але вона містить принаймні два елементи.
struct dirent
{int_td_ino; / / номер I-node
char d_name [NAME_MAX +1]; / / ім'я
файлу}
Константа NAME_MAX залежить від файлової системи в якій розміщується каталог та її значення береться з функції fpathconf (). Часте значення для BSD-систем становить 255.
Структура DIR це внутрішня структура, яка використовується для обробки інформації про каталог, який був прочитаний. Покажчик на структуру DIR, який повертається функцією opendir (), використовується рештою функціями.
Розглянемо два варіанти програми printdir, роздруковує вміст директорії, переданої їй як аргумент.
# Include <stdio.h>
# include <dirent.h>
int sel (struct dirent * d)
{return 1; / / завжди підтверджуємо}
int main (int argc, char ** argv)
{inti, n;
struct dirent ** entry;
if (argc! = 2)
{printf ("Використання:% s <директорія> \ n", argv [0]) ;
return 0;}
n = scandir (argv [1], & entry, sel, alphasort);
if (n <0)
{printf ("Помилка читання директорії \ n");
return 1;}
for (i = 0; i <n; i + +)
printf ("% s inode =% i \ n", entry[i]->d_name, entry [i] -> d_ino);
return 0;}
Функція scandir () створює список елементів зазначеної директорії. Їй необхідно передати покажчик на функцію-фільтр, яка, отримуючи дані про чергове елементі, приймає рішення, включати цей елемент в результуючий список. У нашому прикладі це функція sel (). Якщо при черговому виклику функція sel () поверне значення 0, відповідний елемент директорії не буде включений у кінцевий список. Останній параметр scandir - функція сортування елементів директорії. Ми використовуємо функцію alphasort (), сортують елементи в лексикографічному порядку.
Дані про елементи директорії передаються в структурах dirent. Можна було б очікувати, що структури типу dirent містять багато корисної інформації про елементи директорії, але це не так. Крім імені файлу dirent містить номер inode для цього елемента (простим програмами зазвичай не навіщо знати номери inode, але, щоб наш приклад якось відрізнявся від стандартного, ми включаємо цю інформацію). У структури dirent є ще поле d_type типу char *, але воно, як правило, містить null.
Функція scandir () дозволяє нам отримати повний відсортований список елементів директорії за виклик. У нас є можливість використовувати низькорівневі кошти, які можуть виявитися швидше в тому випадку, якщо сортування файлів нам не потрібна.
Розглянемо другий варіант програми:
# Include <stdio.h>
# include <dirent.h>
int main (int argc, char ** argv)
{DIR * d;
struct dirent * entry;
if (argc! = 2)
{printf ("Використання:% s <директорія> \ n ", argv [0]);
return 0;}
d = opendir (argv [1]);
if (d == NULL)
{printf (" Помилка читання директорії \ n ");
return 1;}
while (entry = readdir (d))
printf ("% s inode =% i \ n", entry-> d_name, entry-> d_ino);
closedir (d);
return 0;}
Цей варіант програми використовує функції opendir (), readdir () і closedir (), які працюють з директорією як з файлом. Функція readdir () повертає значення TRUE до тих пір, поки не будуть прочитані всі елементи директорії.