Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

OS_metod

.pdf
Скачиваний:
9
Добавлен:
07.02.2016
Размер:
480.05 Кб
Скачать

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

Запорізький національний технічний університет

МЕТОДИЧНІ ВКАЗІВКИ

до виконання лабораторних робіт з дисципліни "ОПЕРАЦІЙНІ СИСТЕМИ"

для студентів спеціальностей 8.091501 "Комп’ютерні системи та мережі" та 7.091503 "Спеціалізовані комп'ютерні системи"

всіх форм навчання

2005

2

Методичні вказівки до виконання лабораторних робіт з дисципліни "Операційні системи" для студентів спеціальностей 8.091501 "Комп’ютерні системи та мережі" та 7.091503 "Спеціалізовані комп'ютерні системи" всіх форм навчання. / Укл. Н.Д. Піза, Р.К. Кудерметов. – Запоріжжя: ЗНТУ, 2005. – 62 с.

Укладачі: Н.Д. Піза, к.т.н., ст.викладач, Р.К. Кудерметов, к.т.н., доцент

Рецензент: О.І. Вершина, к.т.н., доцент

Відповідальний за випуск: Піза Н.Д., к.т.н., ст.викладач

Затверджено:

на засіданні кафедри "Комп’ютерні системи та мережі"

Протокол № 5 від 17.02.2005

 

3

 

ЗМІСТ

Вступ

................................................................................................ 4

1

Лабораторна робота №1. Утіліти, системні виклики,

бібліотечні функції. Знайомство з процесами та

 

сигналами .......................................................................................

5

2

Лабораторна робота №2. Командний інтерпретатор

 

bash. Cкрипти..............................................................................

13

3

Лабораторна робота №3. Управління процесами в

 

UNIX ...............................................................................................

32

4

Лабораторна робота №4. Управління пам’ятю:

 

сторінкова організація пам’яті, алгоритми віртуальної

пам’яті............................................................................................

38

5 Лабораторна робота №5. UNIX файли та канали ......

46

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

54

Додаток А. Внутрішні функції shell ..................................

55

Додаток Б. Часто використовувані утіліти UNIX.........

57

Додаток В. Вирази, що вживаються в команді test ......

61

Додаток Г. Спеціальні символи в рядку запрошення . 62

4

ВСТУП

Даний курс лабораторних робіт з дисципліни "Операційні системи" демонструє основні концепції сучасних операційних систем на прикладі операційної системи (ОС) Unix.

Лабораторні роботи в аудиторіях університету виконуются в ОС Linux Red Hat 7.2. Можлива реалізація лабораторних робіт з використанням інших версій ОС Linux (зокрема, Linux ASP, Blin Linux 1.2, які завантажуються з СD-ROM). Тексти програм, що наводяться в даних методичних вказівках, доступні для копіювання та зберігаються на сервері (/commons/os/Labs).

Виконання лабораторної роботи полягає в:

ознайомленні з теоретичними відомостями (конспект лекцій з дисципліни, загальні відомості до лабораторної роботи);

виконанні практичної частини лабораторного завдання, його демонстрації викладачу;

захисті звіту, який виконано згідно зі змістом звіту (що міститься наприкінці кожної лабораторної роботи).

Для виконання практичних завдань потрібно:

завантажити ОС Linux, ввести своє ім’я (login) та пароль (password), які можна отримати у системного адміністратора;

запустити програму Консоль (Главное меню/Системные/ Shell або за допомогою ярлика з зображенням терміналу на панелі задач) або xterm (Главное меню/Запустить про-

грамму…) – вікно емулятора терминала, в якому виконується інтерпретатор. З нього викликати за допомогою меню або команди менеджер файлів – Midnight Commander. Ваш домашній каталог – /home/logname, де logname – ваше зареєстроване ім’я входу в систему (як правило, номер групи/ім’я користувача). Саме в домашньому каталозі треба зберігати свої файли;

рекомендується створити в домашньому каталозі підкаталог os, а в ньому – каталоги lab1, lab2, при виконанні відповідної лабораторної роботи. Файли з текстами програм, які наведені в методичних вказівках, знаходяться на сервері та доступні для копіювання до створених вами каталогів;

дотримуватись вказівок лабораторного завдання.

5

1 ЛАБОРАТОРНА РОБОТА №1. УТІЛІТИ, СИСТЕМНІ ВИКЛИКИ, БІБЛІОТЕЧНІ ФУНКЦІЇ. ЗНАЙОМСТВО З ПРОЦЕСАМИ ТА СИГНАЛАМИ

Мета роботи – вивчити використання системних викликів та бібліотечних функцій, які забезпечує ОС UNIX. Навчитися створювати, компілювати та виконувати програми для ОС Linux, передбачати обробку помилок системних викликів. Навчитися користуватися утілітою довідки man, утілітами управління процесами ps та kill. Ознайомитися з процесами, їх взаємодією за допомогою сигналів.

1.1 Лабораторне завдання

1.1.1 Ознайомтесь з використанням утіліти-довідника man(1) (Manual Pages – сторінки керівництва).

1.1.1.1 Виконайте команди, з’ясуйте що є результатом виводу кожної з них:

$ man man

$ man –S 1 ps $ man kill

$ man –S 2 stat $ man –S 2 chdir

$ man –S 3 printf

Для виходу з сторінки довідника натисніть клавішу <q>. 1.1.1.2 Продемонструйте викладачу вміння знайти довідку за

утілітами: top(1) та ls(1), системними викликами: getpid(2) та signal(2), бібліотечним функціям sleep(3) та getcwd(3).

1.1.2 Вивчіть утіліту ps(1) (process status – стан процесу), яка виводить інформацію про процеси в системі.

1.1.2.1Виконайте команду: $ ps

Поясніть, чому буде виведено тільки два процеси. Що виводиться в самому лівому стовпчику з ім’ям PID?

1.1.2.2 Повний список процесів, які виконуються в системі отримайте за допомогою команди:

6

$ ps –e

1.1.2.3Виконайте команду:

$ ps –e –o pid,ppid,command

Ключ –о pid,ppid,command дозволяє уточнити, яка саме інформація про процес цікавить. В даному випадку це ідентифікатор самого процесу, ідентифікатор його батьківського процессу та команда, за допомогою якої було запущено процес. Результати виконання команди запишіть у звіт (заголовок, перші два рядки та останні два рядки).

1.1.3 Написання першої програми, яка використовує системний виклик.

1.1.3.1Запустіть програму Консоль. З неї викличте Midnight Commander. Перейдіть до свого домашнього каталогу /home/logname. Створіть каталог з ім’ям os, а в ньому підкаталог lab1, в якому будуть зберігатися ваші файли лабораторної роботи №1. Створіть файл L1_chdir1.c, для цього в командному рядку виконайте команду:

$ touch L1_chdir1.c

1.1.3.2Наберіть та збережіть в щойно створеному файлі текст програми L1_chdir1.c в якій демонструється використання системного виклику. Дана програма спочатку змінює поточний каталог процесу за допомогою системного виклику chdir(2), після чого виводить ім’я поточного каталогу на екран з використанням бібліотечної функції getcwd(3C). Ім’я каталогу для зміни вводиться як аргумент командного рядка, який передається до програми.

//Програма L1_chdir1.c: перша програма

//з використанням системного виклику

#include<unistd.h> #define n 128

int main(int argc, char** argv) { char buf[n];

if (chdir(argv[1]) == -1)

{puts("Impossible to change the current directory"); return -1;

}

7

puts(getcwd(buf, n)); return 0;

}

1.1.3.3Вивчіть документацію за системним викликом chdir(2) та бібліотечною функцією getcwd(3C) – див. електронний довідник man.

1.1.3.4Відкомпілюйте програму L1_chdir1.c за допомогою утіліти:

$ gcc –o L1_chdir1 L1_chdir1.c

Врезультаті виконаня утіліти буде отримано файл виконання L1_chdir1 (ліворуч від імені файл позначений символом '*' та в

Midnight Commander має зелений колір). Якщо файл не сформовано, зверніть увагу на помилки при компіляції, виправте їх, знову відкомпілюйте програму.

1.1.3.5 Виконайте програму, для цього в командному рядку наберіть:

$ ./L1_chdir1 ім’я_каталогу_для_зміни

В якості ім’я_каталогу_для_зміни можна задати

/usr/bin або будь-який інший існуючий каталог. Зверніть увагу на результат виконання програми. Для приховування/відновлення панелі Midnight Commander користуйтеся комбінацією клавіш

<Ctrl>+<O>.

1.1.3.6Продемонструйте роботу програми викладачу.

1.1.4 Обробка помилок при виконанні системного виклику.

1.1.4.1 Змініть програму L1_chdir1.c так, щоб в ній виконувалась перевірка: чи успішно було виконано системний виклик chdir, та чи виводилось на екран відповідне до помилки повідомлення, якщо виклик неуспішний. Відзначте, що всі системні виклики перераховують можливі для даного системного виклику помилки на сторінці електроного довідника. Програма L1_chdir2.c буде опрацьовувати помилки: ENOENT, EACCES, ENOTDIR (перелік помилок системного виклику можна отримати за допомогою утіліти man).

//Програма L1_chdir2.c: обробка помилок системного

//виклику

8

#include<stdlib.h>

#include<unistd.h>

#include<errno.h> #define n 128

int main(int argc, char** argv)

{

char buf[n];

if (chdir(argv[1]) == -1)

{puts("Impossible to change the current directory"); switch (errno)

{case ENOENT: perror("ENOENT"); break; case EACCES: perror("EACCES"); break;

case ENOTDIR: perror ("ENOTDIR"); break; default: puts("Another error type");

}

return -1;

}

puts(getcwd(buf, n)); return 0;

}

1.1.4.2Протестуйте програму L1_chdir2 з трьома різними варіантами можливих помилок. Результати тестування запишіть до звіту: три рядки запуску програми з аргументами та три відповідних повідомлення програми.

1.1.4.3Продемонструйте роботу програми викладачу.

1.1.5 Напишіть самостійно програму L1_stat.c, яка використовує системний виклик stat(2) для виводу на экран розміру файла в байтах. Ім’я файла визначайте як аргумент командного рядка.

1.1.5.1Вивчіть документацію за системним викликом stat(2) в електронному довіднику. Зверніть увагу, що параметр buf, змінюється функцією stat, це означає, що потрібно передавати адресу відповідної структури buf. Включіть необхідні заголовочні файли для даного системного виклику.

1.1.5.2Передбачте в програмі обробку помилок: EACCES, ENOTDIR,

ENOENT та виведіть на екран відповідні помилкам повідомлення.

1.1.5.3Продемонструйте роботу програми викладачу.

1.1.5.4Текст розробленої програми подайте у звіті з лабораторної роботи.

9

1.1.6 Використання сигналів. Написання обробника сигналу для перехоплення сигналу: системний виклик signal(2). Використання утіліти kill(1).

1.1.6.1 Вивчіть використання системного виклику signal(2) – див. електронний довідник man. Ознайомтесь з текстом програми L1_signal1.c. Вона містить код для перехоплення сигналу SIGINT та виконання визначеного коду, коли цей сигнал отримано. Процес отримує сигнал SIGINT, коли відбувається натискання комбінації клавіш <CTRL>+<C> або <Del>.

// Програма L1_signal1.c: перехоплення сигналу SIGINT #include <signal.h>

#include <stdio.h> #include <stdlib.h> #include <unistd.h> void handler(int signo)

{

puts("Caught a SIGINT signal, exiting. Bye!"); exit(0);

}

int main(int argc, char** argv)

{// Повідомляємо ОС, що ми бажаємо, щоб вона зробила з сигналом,

//який генерується, при натисканні <CTRL>+<C>

//Посилання на "handler" – адресу покажчика на функцію signal(SIGINT, handler);

puts("Press <CTRL>+<C> to end the program"); while (1) {} // Не робити нічого!

}

1.1.6.2Відкомпілюйте та виконайте дану програму. Натисніть комбінацію клавіш <CTRL>+<C>. Поясніть, як вона працює.

1.1.6.3Тепер запустіть програму L1_signal1 знову. В іншому вікні виконайте команду:

$ kill –2 <pid>

де <pid> – ідентифікатор процесу L1_signal1 (його визначте за допомогою утіліти ps).

Поясніть, результат виводу програми.

Повторіть цей же експеримент з такими значеннями сигналів: $ kill –9 <pid>

10

$ kill –10 <pid>

Поясніть результати виводу програми.

1.1.6.4Продемонструйте роботу програми викладачу.

1.1.6.5Запишіть до звіту з лабораторної роботи повідомлення, що

виводяться на екран після запуску програми L1_signal1 для кожного з трьох системних викликів kill, виконаних з різними типами сигналів згідно з п.1.1.6.3.

1.1.7 Використання сигналів. Направлення процесом сигналу до самого себе. Системні виклики signal(2), kill(2), getpid(2).

1.1.7.1 Вивчіть використання системних викликів kill(2) та getpid(2) – див. електронний довідник man, а також конспект лекцій. Ознайомтесь з текстом програми L1_signal2.c. Визначіть різницю між кодами L1_signal1 та L1_signal2.

//Програма L1_signal2.c: перехоплення та посилання

//сигналу

#include <signal.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> void handler (int signo)

{

puts("Caught a SIGINT signal, exiting. Bye!"); exit (0);

}

int main (int argc, char** argv)

{

signal(SIGINT, handler);

puts("Press <CTRL>+<C> to end the program"); sleep(5);

kill(getpid(), SIGINT); // зміни здійснюйте в цьому рядку

}

1.1.7.2Відкомпілюйте та виконайте програму L1_ signal2. Поясніть, як вона працює.

1.1.7.3Замініть в передостанньому рядку програми (другий

аргумент системного виклику kill) сигнал SIGINT на

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]