- •Міністерство освіти і науки України
- •Жуковецька с.Л., Шестопалов с.В.
- •Анотація
- •Введення
- •Лабораторна робота №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 Технологія розробки програм у середовищі Linux
Мета: Оволодіння технологією розробки програм у системі UNIX. Знайомство з можливостями компілятора. Оволодіння навичками використання основних керуючих структур мови С.
Завдання для самостійної підготовки:
Вивчити:
команди роботи з файловою системою ОС UNIX;
організацію й структуру файлової системи UNIX, обмеження на імена файлів;
види й організацію об'єктних файлів ОС UNIX;
команди дослідження об'єктних файлів;
зміст основних заголовних файлів.
Методичні вказівки
1. Команди роботи з командним інтерпретатором ос unix
Команди для роботи з файловою системою
mkdir - створення каталогу
rmdir - виведення каталогу
touch - створення порожнього файлу
cat - виведення вмісту файлу
ls [-l] - виведення змісту каталогу [докладний]
cp - копіювання файлу
mv - перейменування / переміщення файлу
rmdir - видалення каталогу
rm - видалення файлу
rm-r - видалення каталогу з усім вмістом
cd - зміна поточного каталогу
(.. - батьківський, ~ - домашній, / - кореневий)
ln [-s] - створити жорстку [м'яку] посилання на файл
Інформаційні команди
man - довідкові дані по заданій команді
pwd – встановлення поточного положення у ф.с.
date - показати поточні дату і час
who - показати працюючих користувачів
ps - показати активні процеси
2. Створення програми
Розробка програми починається зі створення вихідних файлів, що містять текст мовою Си. Текстові файли виробляються за допомогою одного з текстових редакторів, підтримуваних у середовищі UNIX.
Хоча UNIX-Файли не мають розширень, задаємо створеному файлу розширення для того, щоб його міг розпізнати компілятор.
.c для мови С и .сс (або .С) для З++.
Програма може включати файли заголовків. Для цього використовується директива #include <ім'я заголовка>
Наприклад,
#include <fcntl.h>
При цьому якщо ім'я файлу укладене в уголковые дужки, це означає, що пошук файлу буде вироблятися в загальноприйнятих каталогах зберігання файлів заголовків. Якщо ж ім'я файлу заголовка укладено в лапки, то використовується явно зазначене або відносне ім'я файлу.
Таблиця 1
Зміст основних заголовних файлів
Файл заголовка |
Призначення |
<assert.h> |
Містить прототип функції assert, що використовується для діагностики |
<cpio.h> |
Містить визначеннящо використовується для файлових архівів cpio |
<ctype.h> |
Містить визначення символьних типів, а також прототипи функцій класів символів |
<dirent.h> |
Містить визначення структур даних каталогу, а також фунцій для роботи з каталогами |
<errno.h> |
Містить визначення кодів помилок |
<fcntl.h> |
Містять прототипи системних викликів fcntl, open, creat, а також визначення констант і структур даних, необхідних при роботі з файлами |
<float.h> |
Містить визначення констант, необхідних для операцій із плаваючою крапкою |
<ftw.h> |
Містять прототипи функцій, що використовується для сканування дерева файлової системи, а також визначення використовуваних констант |
Продовження таблиці 1
Файл заголовка |
Призначення |
<grp.h> |
Містять прототипи функцій і визначення структур даних, що використовуються для роботи з групами користувачів |
<langinfo.h> |
Містить визначення мовних констант дня тижня, назва місяця, а також прототип функції langinfo() |
<limits.h> |
Містить визначення констант, що визначають значення обмежень для даної реалізації |
<locale.h> |
Містить визначення констант, що використовується для створення користувальницького середовища, що залежить від мовних і культурних традицій |
<math.h> |
Містить визначення математичних констант |
<nl_types.h> |
Містить визначення для каталогів повідомлень, а також прототипи функцій catopen і catclose |
<pwd.h> |
Містить визначення структури файлу паролів, а також прототипи функцій для роботи з ним |
<regex.h> |
Містить визначення констант і структур даних, що використовується у регулярних вираженнях, а також прототипи функцій для роботи з ними |
<search.h> |
Містить визначення констант і структур даних, а також прототипи функцій, необхідних для пошуку |
<setjmp.h> |
Містять прототипи функцій переходу, а також визначення пов'язаних з ними структур даних |
<signal.h> |
Містить визначення констант і прототипи функцій, необхідних для роботи із сигналами |
<stdarg.h> |
Містить визначення, необхідні для підтримки списків аргументів змінної довжини |
<stddef.h> |
Містить стандартні визначення |
<stdio.h> |
Містить визначення стандартної бібліотеки уведення-висновку |
<stdlib.h> |
Містить визначення стандартної бібліотеки |
<string.h> |
Містять прототипи функцій роботи з рядками |
<tar.h> |
Містить визначення, що використовуються для файлових архівів |
<termios.h> |
Містить визначення констант. Структур даних і прототипи функцій для термінального уведення-висновку |
Продовження таблиці 1
Файл заголовка |
Призначення |
<time.h> |
Містить визначення типів, констант і прототипи функцій для роботи із часом і датою, а також визначення, що ставляться до дат |
<ulimit.h> |
Містить визначення констант і прототип системного виклику ulimit() для керування обмеженнями, що накладаються на процес |
<unistd.h> |
Містить визначення системних символьних констант, а також прототипи більшості системних викликів |
<utime.h> |
Містить визначення констант і прототип системного виклику utime для роботи з тимчасовими характеристиками файлу |
<sys/ipc.h> |
Містить визначення, що ставляться до системи міжпроцесної взаємодії (IPC) |
<sys/msg.h> |
Містить визначення, що ставляться до системи IPC (повідомлення) |
<sys/resource.h> |
Містить визначення констант і прототипи системних викликів для керування розмірами ресурсів, доступних процесу |
<sys/sem.h> |
Містить визначення, що ставляться до системи IPC (семафори) |
<sys/shm.h> |
Містить визначення, що встановлюються до системи IPC(поділювана пам'ять) |
<sys/stat.h> |
Містить визначення структур даних і прототипи системних викликів, необхідних для одержання інформації про файли |
<sys/times.h> |
Містить визначення структур даних і прототип системного виклику times(), службовця для одержання статистики виконання процесу |
<sys/types.h> |
Містить визначення примітивів системних даних |
<sys/utsname.h> |
Містить визначення прототип системного виклику uname(), що використовується для одержання імен системи |
<sys/wait.h> |
Містить визначення констант і прототипи системних викликів, що використовуються для синхронізації родинних процесів |
При розробці програм, а тим більше - складних, використовується принцип модульности, розбивки складної програми на складові частини, кожна з яких може зберігатися в окремому файлі й підготовлятися окремо.
В операційній системі Linux для компіляції програм написаних мовою C\C++ використовується компілятор GNU C\C++.
Найбільш популярними компіляторами для мови Си в середовищі ОС UNIX зараз є pcc (Ритчи й Томпсон) і gcc - GNU Compiler Collection - (Ричард Столлман).
Переваги gcc:
вільно поширюється.
gcc підтримується й супроводжується.
відкритість вихідних текстів дозволяють додавати до gcc нового кодогенераторы.
Більшість сучасних систем Unix поставляються із уже встановленими компіляторами.
Опції gcc:
Докладно про gcc можна довідатися, виконавши команду
info gcc
Найбільше часто вживаються наступні:
Таблиця 2
-
Оція
Призначення
-c
Тільки компіляція. З вихідних файлів програми створюються об'єктні файли у вигляді name.o. Компонування не виробляється.
-o file-name
Використовувати file-name як ім'я для створюваного gcc файлу (звичайно це файл, що виконується,).
-llibrary-name
Використовувати при компонуванні зазначену бібліотеку.
-v
Довідатися версію пакета gcc, що зараз використовується
-g
Генерує код для налагодження із символьним отладчиком sdb(1). Зауваження: при використанні опції -g таблиця символів не віддаляється.
-O
Викликає оптимізатор об'єктного коду, що зменшує розмір і збільшує швидкість програми за допомогою переміщення, об'єднання й видалення коду.
Продовження таблиці 2
-
Оція
Призначення
-S
Не викликає асемблер. Залишає результат у файлі з расширением.s. Цей файл буде містити команди мови асемблера, "рідного" для цільового комп'ютера.
Компіляція одного модуля:
У найпростішому випадку відкомпілювати програму можна, запускаючи компілятор командою
gcc ім'я_вихідного_файлу
Якщо програма була написана без помилок, то компілятор створить виконується файл, що, з ім'ям a.out. Змінити ім'я створюваного файлу, що виконується, можна, задавши його за допомогою опції -o:
gcc ім'я_вихідного_файлу -o ім'я_ щовиконується_файлу
Наприклад,
Gcc file.c -o file.exe або gcc -o file file.c
Запустити на виконання з поточного каталогу можна так:
./file
Щоб відкомпілювати вихідний код, що перебуває у файлі F.cc, і створити об'єктний файл F.o, виконаєте команду:
gcc -c <compile-options> F.c
Тут рядок compile-options указує можливі додаткові опції компіляції.
Отладчик gdb
Для налагодження програм використовується стандартний отладчик gdb. Формат його виклику наступний:
gdb <виконується файл, щоМ,> [<core файл>|<pid процесу>]
core файл – файл створюваний при аварійному виході програми при виникненні критичної помилки. Якщо core файл зазначений, він буде автоматично розібраний отладчиком gdb, і можна буде визначити, у якій крапці програми відбулася помилка. Якщо зазначено pid процесу, отладчик підключиться до цього процесу.
Розглянемо команди отладчика gdb.
B <номер рядка>
або
b <ім'я вихідного модуля>:<номер рядка> - установлює крапку останова в заданому рядку в зазначеному або поточному модулі;
r - запускає програму на виконання;
n - виконує черговий рядок програми без входу у функцію;
s - виконує черговий рядок програми із входом у функцію;
p <ім'я змінної> - виводить уміст змінної; q - вихід з отладчика.