Команди роботи з командним інтерпретатором ОС UNIX



Міністерство освіти і науки України

ОДЕСЬКА ДЕРЖАВНА АКАДЕМІЯ ХОЛОДУ


Жуковецька С.Л.,

Шестопалов С.В.

СИСТЕМНЕ

ПРОГРАМУВАННЯ

 

Посібник до виконання лабораторних

Та самостійних робіт

 

 

Одеса 2011

Жуковецька С.Л., Шестопалов С.В. Системне програмування: Посібник до виконання лабораторних та самостійних робіт. Одеська державна академія холоду, 2011. – 60 с.

Посібник розроблено згідно з робочою навчальною програмою дисципліни «Системне програмування». Посібник призначений для студентів, що навчаються за спеціальностями “Компьютерні системи та мережі” та «Спеціалізовані комп’ютерні системи».

Наведено перелік теоретичних питань для поглибленого опрацювання.

 

Рецензент: Шпінарьова І.М., к. т. н., доцент кафедри МОКС ОНУ

 

Завідувач кафедри

інформаційних систем і мереж                    

д. т. н., професор                                                                      Князєва Н.О.

 

Голова науково-методичної комісії

з напряму підготовки «Комп’ютерні науки»                 Корнієнко Ю.К.

Анотація

 

Дисципліна „Системне програмування” викладається студентам 3 курсу у 5 навчальному семестрі. Форма підсумкового контролю - екзамен. Лабораторний практикум містить 6 робіт.

Для засвоєння курсу студенти мають знати базові принципи програмування та основи мови програмування С.

У процесі виконання лабораторних робіт студенти розробляють програмні модулі з використанням мови системного програмування С.

Лабораторні роботи розглядають питання створення та керування файлами, створення та керування процесами, міжпроцесну взаємодію.

При виконанні лабораторних робіт використовуються механізми контролю та обробки помилок.

Курс є основою для подальшого вивчання системного програмного забезпечення, створення вбудованих систем та інших.

 

 

Зміст

 

 

Введення…………………………………………………………….. 5

Лабораторна робота №1 Технологія розробки програм у середовищі     

                                      Linux. 6

Лабораторна робота № 2. Автоматизація пакетних завдань». 19

Лабораторна робота № 3. Взаємодія програми з середовищем    

                                       виконання. 24

Лабораторна робота №4. Контроль виконання програми. 30

Лабораторна робота №5 Файлові API. 41

Лабораторна робота №6  Робота з каталогами та посиланнями. 52

Лабораторна робота №7. Одержання і відображення метаданих  

                                       файлу. 62

Лабораторна робота №8. Керування процесами. 79

Лабораторна робота №9. Використання каналів. 92

Лабораторна робота №10 Використання повідомлень. 98

Література. 104

Введення

 

Мета курсу: продовження знайомства з операційними системами. Як приклад розглянута операційна система Linux. Методичний посібник містить у собі теоретичний матеріал і вказівки до виконання лабораторних робіт. Для поглибленого вивчання відповідних розділів необхідно використовувати додаткову літературу, список рекомендованих книг наведений у розділі Бібліографія.

 

Вимоги до оформлення робіт

По кожній лабораторній роботі складається звіт, що повинен містити:

− титульний аркуш;

− назва й ціль роботи;

− лабораторне завдання;

− опис даних і при необхідності опис структури програми;

− текст програми;

− результати виконання програм;

− висновки за результатами виконання роботи.

 

Звіт може представлятися у вигляді твердої копії або у вигляді текстового файлу.

Лабораторна робота №1 Технологія розробки програм у середовищі Linux

Мета:Оволодіння технологією розробки програм у системі UNIX. Знайомство з можливостями компілятора. Оволодіння навичками використання основних керуючих структур мови С.

 

Завдання для самостійної підготовки:

Вивчити:

− команди роботи з файловою системою ОС UNIX;

− організацію й структуру файлової системи UNIX, обмеження на імена файлів;

− види й організацію об'єктних файлів ОС UNIX;

− команди дослідження об'єктних файлів;

− зміст основних заголовних файлів.

 

Методичні вказівки

Команди роботи з командним інтерпретатором ОС UNIX

 

Команди для роботи з файловою системою

mkdir - створення каталогу

rmdir - виведення каталогу

touch - створення порожнього файлу

cat - виведення вмісту файлу

ls [-l] - виведення змісту каталогу [докладний]

cp - копіювання файлу

mv - перейменування / переміщення файлу

rmdir - видалення каталогу

rm - видалення файлу

rm-r - видалення каталогу з усім вмістом

cd - зміна поточного каталогу

   (.. - батьківський, ~ - домашній, / - кореневий)

ln [-s] - створити жорстку [м'яку] посилання на файл

 

Інформаційні команди

man - довідкові дані по заданій команді

pwd – встановлення поточного положення у ф.с.

date - показати поточні дату і час

who - показати працюючих користувачів

ps - показати активні процеси

 

Створення програми

 

Розробка програми починається зі створення вихідних файлів, що містять текст мовою Си. Текстові файли виробляються за допомогою одного з текстових редакторів, підтримуваних у середовищі 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 - вихід з отладчика.

 

Функції введення-виведення.

 

printf  - Виробляє форматований вивід в stdout.

Синтаксис

 # include <stdio.h>

 int printf (const char * format [, argument, ...]);

 

Рrintf отримує набір аргументів, застосовує до кожного відповідну специфікацію формату з рядка format, і виводить форматовані дані в stdout. Число аргументів повинне відповідати числу специфікацій формату в format.

Рядок формату керує тим, як будуть змінюватися, і друкуватися аргументи функції. Для заданих специфікацій формату повинна бути достатня кількість адресних аргументів; якщо це не дотримується, результат може бути непередбачуваним і, ймовірно помилковим. Зайві адресні аргументи (більше, ніж вимагає формат) будуть проігноровані.

Рядок формату - це символьний рядок, що складається з двох типів об'єктів - просто символи і специфікації перетворення.

Прості символи переносяться у висновок без змін. Специфікації перетворення застосовуються для форматування.

 

% D - ціле десяткове зі знаком

%i - ціле десяткове зі знаком

%o - ціле вісімкове без знака

%u - ціле десяткове без знака

%x - ціле шістнадцяткове без знака (з літерами a, b, c, d, e, f)

% X - ціле шістнадцяткове без знака (з літерами A, B, C, D, E, F).

%f - значення зі знаком у формі [-]dddd.dddd

%e - значення зі знаком у формі [-] d. dddd e [+/-]ddd

%g - значення зі знаком або у формі f, або у формі e, з даними значенням і точністю. Хвостові нулі і десяткова крапка друкуються тільки при необхідності

%E - так само, як у випадку e, тільки з буквою E для позначення ступеня

%G - так само, як у випадку g, тільки з буквою E для позначення ступеня

 

Приклад:

 

printf ("Hi% c% d% s", 'c', 10, "there!");

 

На екрані "Hi c 10 there!"

 

scanf - Виконує форматований введення з потоку stdin.

Синтаксис  

 # include <stdio.h>

 int scanf (const char * format [, adress, ...]);

 

Scanf переглядають вхідні поля, символ за символом, зчитуючи їх з потоку stdin. Потім кожне поле форматується у відповідності зі специфікацією формату, переданої scanf аргументом format. Після цього вона записує відформатований введення за адресами, заданим аргументами, наступними за форматної рядком. Число специфікацій формату має відповідати числу адрес.

Рядок формату керує тим, яким чином кожна функція буде зчитувати, перетворювати і записувати вхідні поля.

Рядок формату - це символьний рядок, що містить три типи об'єктів: незначні символи, значущі символи і специфікації формату.

Незначні символи - це порожньо (), знак табуляції (\ t) і символ переходу на новий рядок (\ n). Як тільки функція зустрічає незначущий символ в рядку формату, вона зчитує, але не зберігає всі наступні незначні символи до тих пір, поки не зустрінеться перший значущий символ.

Значущі символи - це все символи ASCII, за винятком знака відсотка (%). Якщо функція зустрічає в форматної рядку значущий символ, вона зчитує, але не зберігає даний символ.

Специфікація формату відповідає специфікації для printf.

 

Приклад:

scanf ("% d", & x);

зчитуємо десяткове значення в змінну х. 

 

putchar- Виводить символ у потік stdout.

Синтаксис

# include <stdio.h>

int putchar (int c);

 

putchar при успішному завершенні putchar повертає виведений символ c. При помилку він повертає EOF.

   

Приклад:

putchar ('*');

- виводить на екран символ «*».

 

Приклад програми

 

Приклад програми, що виводить на екран привітання:

# include <stdio.h>

int main (void)

{printf ("Hello, World! \ N");

return 0;}


Дата добавления: 2018-04-05; просмотров: 530; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!