Page 33 - 4820
P. 33
Процеси можуть взаємодіяти між собою за допомогою так званих сигналів. Існує
обмежена кількість сигналів, які мають свої числові ідентифікатори і мнемонічні
позначення. Сигнали діють як переривання, тобто вони призупиняють процес, до якого
вони направлені, і викликають відповідний обробник сигналу. Деякі із сигналів мають
чітко визначене значення і обробляються системним обробником. Інші можуть
перехоплюватись процесом, тобто процес може встановлювати для цих сигналів свій
обробник. Звичайно, існують певні узгодження щодо призначення певних сигналів, і
програмістам слід дотримуватись їх при розробці своїх обробників.
Користувач також може відправити процесу сигнал, для цього існує команда kill.
Формат команди:
kill [-<сигнал>] <PID>
<сигнал> – це мнемонічне або числове позначення сигналу (наприклад, STOP, TERM,
CONT, 9), а <PID> –ідентифікатор процесу, якому посилають сигнал. Якщо не вказати
параметр <сигнал>, то буде відправлено сигнал завершення процесу TERM (15). Цей
сигнал може перехоплюватись процесом, але існує сигнал KILL (9), який не
перехоплюється і безумовно знищує процес (якщо у користувача є достатньо для цього
прав). Таким чином, можна зупинити будь-який свій процес, якщо над ним втрачене
керування (або процес “завис”, що у системі UNIX трапляється дуже нечасто, або
користувач не знає, яку команду процес може сприйняти). Для цього слід зайти з іншої
консолі (віртуального або фізичного терміналу) і дати команду kill -9 <PID>, де <PID>
можна дізнатись за допомогою попередньої команди ps.
Команда ps без аргументів дає список лише процесів даного користувача і (в
деяких системах) лише пов’язаних з конкретним терміналом. При роботі в графічній
оболонці, а також при роботі на персональному комп’ютері, де підтримується певна
кількість так званих віртуальних терміналів, користувач може працювати в системі,
використовуючи одночасно кілька терміналів (наприклад, на персональних
комп’ютерах між ними можна переключатись комбінаціями клавіш Alt+F#, де F# –
одна з функціональних клавіш). Однак в часи створення системи UNIX такі можливості
не передбачались. Передбачалось, що користувач має доступ лише до одного
терміналу. Тому було розроблено систему завдань і фонового виконання процесів,
щоби користувач міг одночасно виконувати різні задачі.
Коли користувач дає команду з консолі, в системі запускається процес, або
кілька процесів. Якщо в командному рядку утворюється конвеєр (наприклад, ls –l | wc –
l), то всі процеси (у нашому прикладі ls і wc) запускаються одночасно. Разом вони
складають так зване завдання. Завдання пов’язано з терміналом. Поки воно не
завершиться, користувач не має можливості вводити наступну команду. Це так званий
пріоритетний (foreground) режим виконання завдання. Щоби під час виконання
завдання мати можливість запускати інше завдання, перше з них слід запустити в так
званому фоновому (background) режимі. Для того, щоби запустити завдання в
фоновому режимі, слід завершити рядок команди символом “&” (після пробілу). При
цьому стандартний ввід за замовчанням назначається порожньому файлу /dev/null. Слід
врахувати, що завдання в фоновому режимі може намагатись здійснювати вивід на
екран, заважаючи при цьому виводу пріоритетного процесу (спробуйте працювати,
запустивши у фоновому режимі команду ping). Тому слід подбати, щоби фонові
завдання здійснювали вивід у файли (див. Лабораторну роботу №4). Завдання, що було
запущено у пріоритетному режимі, можна перевести у фоновий. Для цього необхідно
спочатку призупинити виконання завдання (комбінація клавіш CTRL-Z). Далі можна
поновити виконання завдання у пріоритетному режимі (команда fg) або у фоновому
31