Команда trap: перехоплення переривань

Якщо натиснути клавішу Del або повісити телефонну трубку під час виконання команди watchwho, в каталозі / tmp залишаться один або два тимчасових файлу Перед виходом watchwho повинна видаляти свої тимчасові файли Необхідно мати можливість виявляти подібні ситуації і спосіб відновлення нормального перебігу подій

При натисканні клавіші Del сигнал переривання посилається всім процесам, працюючим на терміналі зараз Аналогічно, коли повішена телефонна трубка, відправляється сигнал відбою Існують і інші сигнали До тих пір поки програма не обробляє сигнали явно, сигнал буде завершувати її виконання Оболонка захищає програми, запущені з використанням & від переривань, але не від відєднання

У главі 7 буде детально розказано про сигнали, а для того щоб обробляти їх в оболонці, треба знати лише небагато що Вбудована в оболонку команда trap визначає послідовність команд, яка повинна бути виконана, коли надійде сигнал:

trap последовательность5команд спісок5номеров5сігналов

Последовательность5команд є єдиним аргументом, так що майже завжди доводиться укладати її в лапки Номери сигналів – це цілі числа, що ідентифікують сигнали Наприклад, 2 – це сигнал, що генерується при натисканні клавіші Del, А 1 – сигнал, генерований, коли повішена телефонна трубка Номери сигналів, найбільш часто використовуються при програмуванні в оболонці, перераховані в табл 54

Таблиця 54 Номери сигналів оболонки

Номер

Значення

0

1

2

3

9

15

вихід з оболонки (по будь-якої причини, в тому числі в кінці файлу) відбій (повішена телефонна трубка)

переривання (клавіша Dela)

вихід (ctl– \ вимагає від програми створення дампа памяті) kill (не може бути ні перехоплений, ні проігнорований) завершення – сигнал, за замовчуванням генерований kill (1)

a На клавіатурах старих терміналів була спеціальна клавіша Del, Виданого вавшейся сигнал переривання Для того щоб послати поточному процесу SIGINT, використовуйте комбінацію клавіш Ctrl+CПрямуючи науч ред

Тому для того, щоб очистити тимчасові файли в watchwho, безпосередньо перед циклом слід помістити команду trap для пере хвата сигналів відбою, переривання і завершення:

trap rm  –f  $new $old  exit 1 1 2  15 while  :

Послідовність команд, що утворює перший аргумент trap, подібна зверненням до підпрограми, яке відбувається відразу ж після отримання сигналу Коли вона закінчується, програма, яка виконувалася, буде відновлена ​​з того місця, в якому вона перебувала до отримання сигналу Таким чином, послідовність команд trap повинна явно запустити exit, інакше програма оболонки продовжуватиме виконуватися після переривання Ще одне зауваження – після довність команд буде прочитана двічі: в момент установки trap і в момент звернення до неї Тому краще помістити послідовність команд в одинарні лапки, тоді змінні будуть обчислюватися тільки при виконанні функцій trap У прикладі, розглянутому зараз, це не має особливого значення, але пізніше буде приведений ще один приклад, для якого це важливо Параметр-f ука зивает команді rm, що вона не повинна ставити запитань

Буває, що trap виявляється зручною при інтерактивній роботі, найчастіше це відбувається тоді, коли треба запобігти знищенню програми сигналом відбою, згенерованим перерваним телефонним зєднанням:

$ (trap’ 1 довго-що виконується-команда) &

2134

$

Порожня послідовність команд означає вимогу «ігнорувати переривання» в даному процесі і в породжених їм процесах Дужки у записі команди є причиною того, що trap і команда виконуються разом у фоновому режимі в підоболонці якби дужок не було, то trap була б застосована і до батьківської оболонці і до дол-го-що виконується-команді

Команда nohup (1) – це коротенька програма оболонки, що надає таку послугу Ось її повна версія в сьомій версії:

$ cat  `which  nohup`

trap &quot&quot  1 15

if test  –t  2&gt&amp1 then

else fi

$

echo  &quotSending  output   to  nohupout&quot exec  nice  –5  $*  &gt&gtnohupout  2&gt&amp1

exec  nice  –5 $* 2&gt&amp1

Команда test-t перевіряє, чи є стандартний висновок терміналом, для того щоб знати, чи треба зберігати вихідні дані Про-

грама запускається у фоновому режимі з nice, отримуючи таким чином більш низький пріоритет, ніж інтерактивні програми (Зверніть увагу на те, що nohup не ставить PATH Чи повинна вона це робити)

Команда exec включена тільки для підвищення продуктивності без неї команди виконувалися б точно так само, як і з нею Але exec вбудована в оболонку, вона замінює процес виконується в даний час оболонки зазначеною програмою, економлячи таким чином один процес – оболонку, яка зазвичай чекала б завершення програми Можна було використовувати команду exec і в багатьох інших місцях, наприклад в кінці поліпшеною програми cal, коли відбувається звернення до / usr / bin / cal

До речі, сигнал 9 – це той сигнал, який не може бути перехоплений або проігнорований він знищує завжди З оболонки він надсилається таким чином:

$ kill -9 ідентіфікатор5процесса..

За замовчуванням kill -9 не використовується, тому що у процесу, унич Тожа таким сигналом, немає можливості «привести справи в порядок», перш ніж померти

Вправа 514Версія програми nohup, представлена ​​вище, обєднує стандартний висновок помилок зі стандартним вихідним потоком Чи добре це Якщо ні, то як акуратно відокремити їх один від одного

Вправа 515Знайдіть вбудовану в оболонку команду times і додайте в свій Profile рядок так, щоб при виході з системи оболонка повідомляла, скільки було використано процесорного часу

Вправа 516Напишіть програму, яка шукала б слідую щий доступний ідентифікатор користувача в / etc / passwd Якщо вам це цікаво (і є відповідні права), переробіть таким чином команду, додаючу нового користувача в систему Які потрібні права Як слід обробляти переривання

Джерело: Керниган Б, Пайк Р, UNIX Програмне оточення – Пер з англ – СПб: Символ-Плюс, 2003 – 416 с, Мул

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*