1   2   3   4   5   6
Ім'я файлу: OS-Labs-1-6_22.pdf
Розширення: pdf
Розмір: 1042кб.
Дата: 10.11.2022
скачати
PPID (parent process ID). Таким чином
52

Операційні системи – лабораторний практикум
утворюється ієрархія процесів, що бере початок від початкового процесу
init.
Створення нового процесу у системі UNIX виконується у два етапи.
Спочатку системний виклик fork() викликає “розщеплення” поточного процесу на два тотожні (різниця буде лише у тому, що процес-“нащадок” має
інші PID і PPID). Далі виконується системний виклик exec(), який
“підміняє” контекст поточного процесу іншим контекстом. Розглянемо типовий приклад, коли один процес має запустити на виконання інший –
командна оболонка sh виконує команду ls, для чого утворює новий процес, в якому виконується програма /usr/bin/ls. Для цього програміст, який пише код sh, повинен передбачити такі кроки:
1.
Якщо під час синтаксичного аналізу командного рядка виявлено, що необхідно запустити на виконання деяку команду, то виконується виклик fork().
53

Операційні системи – лабораторний практикум
2.
Наступна за fork() інструкція перевіряє значення, що повернув виклик. Якщо виклик fork() був успішний, тов результаті його виконання утворюється новий процес, тотожній батьківському, і операційна система буде виконувати
їх обидва (в режимі розділення часу. Для процесу-“нащадка” значення, що повертає fork(), дорівнює 0, для батьківського процесу повертається значення PID нащадка.
3.
Якщо це процес-нащадок, то виконується виклик exec(), якому в якості параметра передається ім’я файлу програми, яку необхідно запустити на виконання (в нашому прикладі – /
usr/bin/ls). Якщо виклик був успішний, тона цьому виконання коду sh припиняється, і на його місце завантажується код ls.
Якщо це батьківський процес, то його дії залежать від того, які параметри були у командному рядку. Зокрема, якщо ls було запущено у пріоритетному режимі
7
, то виконання sh призупиняється до завершення процесу-нащадка, якщо ж ls було запущено у фоновому режимі, то sh видає необхідні повідомлення про запуск фонового процесу і продовжує свою роботу, тобто знову приймає і редагує командний рядок.
Процеси можуть взаємодіяти між собою за допомогою так званих сигналів. Існує обмежена кількість сигналів, які мають свої числові
ідентифікатори і мнемонічні позначення. Сигнали діють як переривання, тобто вони призупиняють процес, до якого вони направлені, і викликають відповідний обробник сигналу. Деякі із сигналів мають чітко визначене значення і обробляються системним обробником. Інші можуть перехоплюватись процесом, тобто процес може встановлювати для цих сигналів свій обробник. Звичайно, існують певні узгодження щодо призначення певних сигналів, і програмістам слід дотримуватись їх при розробці своїх обробників.
Користувач також може відправити процесу сигнал, для цього існує команда kill. Формат команди:
kill сигнал сигнал – це мнемонічне або числове позначення сигналу (наприклад,
STOP, TERM, CONT, 9), а <PID> –ідентифікатор процесу, якому посилають сигнал. Якщо не вказати параметр сигнал, то буде відправлено сигнал завершення процесу TERM (15). Цей сигнал може перехоплюватись процесом, але існує сигнал KILL (9), який не перехоплюється і безумовно знищує процес (якщо у користувача є достатньо для цього прав. Таким
7
Про пріоритетний і фоновий режими див. далі
54

Операційні системи – лабораторний практикум
чином можна зупинити будь-який свій процес, якщо над ним втрачене керування (або процес завис, що у системі UNIX трапляється дуже нечасто, або користувач не знає, яку команду процес може сприйняти). Для цього слід зайти з іншої консолі (віртуального або фізичного терміналу) і дати команду
kill -9 < PID>, де <PID> можна дізнатись за допомогою попередньої команди Команда ps без аргументів дає список лише процесів даного користувача і (в деяких системах) лише пов’язаних з конкретним терміналом. При роботі в графічній оболонці, а також при роботі на персональному комп’ютері, де підтримується певна кількість так званих віртуальних терміналів, користувач може працювати в системі, використовуючи одночасно кілька терміналів (наприклад, на персональних комп’ютерах між ними можна переключатись комбінаціями клавіш Alt+F#, де F# – одна з функціональних клавіш). Однак в часи створення системи UNIX такі можливості не передбачались. Передбачалось, що користувач має доступ лише до одного терміналу. Тому було розроблено систему завдань і фонового виконання процесів, щоби користувач міг одночасно виконувати різні задачі. Коли користувач дає команду з консолі, в системі запускається процес, або кілька процесів. Якщо в командному рядку утворюється конвеєр
(наприклад, ls –l | wc –l ), то всі процеси (у нашому прикладі ls і wc) запускаються одночасно. Разом вони складають так зване завдання. Завдання повязано з терміналом. Поки воно не завершиться, користувач не має можливості вводити наступну команду. Це так званий пріоритетний
(foreground) режим виконання завдання. Щоби під час виконання завдання мати можливість запускати інше завдання, перше з них слід запустити в так званому фоновому (background) режимі. Для того, щоби запустити завдання в фоновому режимі, слід завершити рядок команди символом
“&” (після пробілу). При цьому стандартний ввід за замовчанням назначається порожньому файлу
/dev/null
. Слід врахувати, що завдання в фоновому режимі може намагатись здійснювати вивід на екран, заважаючи при цьому виводу пріоритетного процесу (спробуйте працювати, запустивши у фоновому режимі команду ping). Тому слід подбати, щоби фонові завдання здійснювали вивід у файли (див. Лабораторну роботу №4). Завдання, що було запущено у пріоритетному режимі, можна перевести у фоновий. Для цього необхідно спочатку призупинити виконання завдання (комбінація клавіш
CTRL-Z). Далі можна поновити виконання завдання у пріоритетному режимі команда fg) або у фоновому режимі (команда bg). Завдання мають свої номери. Переглянути їх можна за допомогою команди jobs.
Важливою можливістю є запуск певних завдань за розкладом. Це реалізується за допомогою програми-демона crond, який переглядає свої файли crontab (окремі для кожного користувача) і запускає завдання згідно
55

Операційні системи – лабораторний практикум
розкладу від імені того користувача, в файлі якого це завдання задано. Для зміни розкладу завдань треба відредагувати файл
crontab і після цього перезапустити crond, що може зробити лише root та ті користувачі, яким це право надано. Останнім рекомендується для цього користуватись командою
crontab, яка після редагування автоматично перезапускає crond.
Користувачу дозволено виконувати команду crontab тільки за умови, що його ім’я зустрічається в файлі cron.allow і не зустрічається в файлі
cron.deny (в різних системах Unix ці файли можуть знаходитись в різних каталогах, наприклад /usr/lib/cron/ або /etc/cron.d/). Якщо обидва файли відсутні, то тільки root може користуватись командою
crontab. Якщо cron.allow не існує, cron.deny існує, але не містить
імен, то використовувати команду
crontab дозволено усім. Файли
cron.allow і cron.deny повинні містити по одному імені в рядку.
Існує спеціальна команда
at, яка призначена для одноразового виконання заданої команди в будь-який заданий час. Правила дозволу і заборони користування командою at аналогічні crontab (файли
at.allow і at.deny). Завдання, що задані командою at, виконуються тим же демоном crond.
56

Операційні системи – лабораторний практикум
Завдання до виконання
1. Перегляньте список процесів користувача (Вас. Перегляньте повний список процесів, запущених у системі. При цьому гарантуйте збереження інформації від "утікання" з екрана (якщо процесів багато). Зверніть увагу на ієрархію процесів. Простежте через поля
PID
і
PPID
всю ієрархію процесів тільки-но запущеної Вами команди, починаючи з початкового процесу init. Зверніть увагу на формування інших полів виводу.
3. Запустіть ще один
shell
. Перегляньте повний список процесів, запущених вами, при цьому зверніть увагу на ієрархію процесів і на
їхній зв'язок з терміналом. Використовуючи команду
kill
, завершіть роботу в цьому і. Перегляньте список задачу системі і проаналізуйте їхній стан. Запустіть фоновий процес командою / -name "*.c" -print > file 2> /dev/null &

8
6. Визначте його номер. Відправте сигнал призупинення процесу.
Перегляньте список задачу системі і проаналізуйте їхній стан.
Продовжить виконання процесу. Знову перегляньте список задачу системі і проаналізуйте його зміну. Переведіть процес в активний режима потім знову у фоновий. Запустіть цей процес із пріоритетом
5.
7. Виведіть на екран список усіх процесів, запущених не користувачем
root.
8. Організуйте вивід на екран календаря <1996+№варіанту> року через 1 хвилину після поточного моменту часу. Організуйте періодичне (щоденне) видалення в домашньому каталозі усіх файлів з розширенням
*.bak
і
*.tmp
8
Увага! Ця команда коректно працює в оболонках sh і bash, і не працює коректно у оболонках csh і tcsh (цепов язано з правилами перенаправлення потоку помилок, див. Лабораторну роботу №3).
57

Операційні системи – лабораторний практикум
Лабораторна робота №6. Професійна робота з
командними оболонками
Мета
Оволодіння практичними навичками професійної роботи з командною оболонкою shell – використання змінних і створення командних файлів.
Завдання для самостійної підготовки
1. Вивчити:

організацію умовного виконання командного рядка, угруповання команду командному рядку;

використання змінних shell;

організація командних файлів: передача параметрів, уведення значень, умовні розгалуження і цикли;

арифметичні обчислення в shell.
2. Розробити алгоритм рішення відповідно до завдання
3. Скласти програми рішення завдань
4. Підготувати тест для перевірки програм
Довідковий матеріал У попередніх роботах ми вже познайомились з командними оболонками (shell). У цій роботі розглянемо прийоми професійної роботи з командними оболонками, а саме використання змінних оточення і створення командних файлів.
Змінні оточення
Усі змінні вашого оточення виводяться за допомогою команди set, ознайомтесь з ними.
Командні файли
Командний файл, або сценарій (також дуже часто кажуть скрипт від англійського script – сценарій) є текстовим файлом, який оформлено з дотриманням певних правил, і який містить команди, у найпростішому випадку повністю аналогічні тим командам, що вводяться з клавіатури.
Командна оболонка здатна запускати такий файл на виконання і послідовно виконувати команди, що містяться в ньому. Для користувача, що запустив
58

Операційні системи – лабораторний практикум
цей сценарій, його виконання буде виглядати як виконання звичайної програми.
Зверніть увагу на розбіжності у різних програмних оболонках shell, які суттєві для програмування. Під час виконання роботи впевніться, в якій із програмних оболонок Ви працюєте (зазвичай, для FreeBSD це csh чи tcsh
, а для Linux – bash
, який є розвитком sh
), і яка буде запускатись для виконання Вашого командного файлу (це визначається першим рядком
Вашого командного файлу. Уважно прочитайте правила використання операторів if і формування перевірки відповідної умови. Зверніть увагу на команду test.
Важливою можливістю командних оболонок (усіх) є обробка так званих пакетних файлів.
Завдання до виконання
Написати скрипт для виконання наступного завдання:
Частина 1 1. Визначити, хто є користувачем системи та виведіть на екран.
2. За допомогою змінних оточення визначити домашній каталог користувача
3. Знайти всі файли, які належать вам у вашому домашньому каталозі
4. За архівувати ці файли з іменем back_up__.
5. Якщо архів з даним іменем вже існує, то вивести запит на його перезапис.
6. Встановити права на отриманий архів тільки для читання.
Частина 2 1. Розархівувати файли з архіву зі збереженням структури каталогів
2. Якщо файли відрізняються у порівнянні з оригіналом, то потрібно виводитися запит на його перезапис.
59

1   2   3   4   5   6

скачати

© Усі права захищені
написати до нас