
- •Практичне заняття 8 Організація уведення-виведення в unix. Файли пристроїв. Апаратні переривання
- •Операції над файловими системами. Монтування файлових систем
- •Блокові, символьні пристрої. Поняття драйвера. Блокові, символьні драйвери, драйвери низького рівня. Файловий інтерфейс
- •Апаратні переривання (interrupt), виключення (exception), програмні переривання (trap, software interrupt). Їх обробка
- •Поняття сигналу. Способи виникнення сигналів і види їх обробки
- •Поняття групи процесів, сеансу, лідера групи, лідера сеансу, управляючого терміналу сеансу. Системні виклики getpgrp(), setpgrp(), getpgid(), setpgid(), getsid(), setsid()
- •Системний виклик kill() і команда kill
- •Вивчення особливостей отримання термінальних сигналів поточною і фоновою групою процесів
- •Системний виклик signal(). Установка власного обробника сигналу
- •Прогін програми, що ігнорує сигнал sigint
- •Прогін програми з призначеною для користувача обробкою сигналу sigint
- •Відновлення попередньої реакції на сигнал
- •Сигнали sigusr1 і sigusr2. Використовування сигналів для синхронізації процесів
- •Завершення породженого процесу. Системний виклик waitpid(). Сигнал sigchld
- •Прогін програми для ілюстрації обробки сигналу sigchld
- •Виникнення сигналу sigpipe при спробі запису в pipe або fifo, який ніхто не збирається читати
- •Поняття про надійність сигналів. Posix функції для роботи з сигналами
- •Питання до захисту роботи
Системний виклик kill() і команда kill
Зі всіх перерахованих раніше в розділі "Апаратні переривання (interrupt), виключення (exception), програмні переривання (trap, software interrupt). Їх обробка" джерел сигналу користувачу доступні тільки два – команда kill і посилка сигналу процесу за допомогою системного виклику kill(). Команда kill звичайно використовується в наступній формі:
kill [-номер] pid
Тут pid – це ідентифікатор процесу, якому посилається сигнал, а номер – номер сигналу, який посилається процесу. Послати сигнал (якщо у вас немає повноважень суперкористувача) бути можна тільки процесу, у якого ефективний ідентифікатор користувача співпадає з ідентифікатором користувача, що посилає сигнал. Якщо параметр –номер відсутній, то посилається сигнал SIGTERM, звичайно має номер 15, і реакція на нього за умовчанням – завершити роботу процесу, який одержав сигнал.
Команда kill
kill [-signal] [--] pid
kill -l
Опис команди
Команда kill призначена для передачі сигналу одному або декільком специфікованим процесам в рамках повноважень користувача.
Параметр pid визначає процес або процеси, яким доставлятимуться сигнали. Він може бути заданий одним з наступних чотирьох способів:
Число n > 0 – визначає ідентифікатор процесу, якому буде доставлений сигнал.
Число 0 – сигнал буде доставлений всім процесам поточної групи для даного управляючого терміналу.
Число -1 з передуючою опцією -- – сигнал буде доставлений (якщо дозволяють повноваження) всім процесам з ідентифікаторами, великими 1.
Число n < 0, де n не рівно -1, з передуючою опцією -- – сигнал буде доставлений всім процесам з групи процесів, ідентифікатор якої рівний -n.
Параметр -signal визначає тип сигналу, який повинен бути доставлений, і може задаватися в числовій або символьній формі, наприклад -9 або -SIGKILL. Якщо цей параметр опущений, процесам за умовчанням посилається сигнал SIGTERM.
Послати сигнал (не маючи повноважень суперкористувача) бути можна тільки процесу, у якого ефективний ідентифікатор користувача співпадає з ідентифікатором користувача, що посилає сигнал.
Опція -l використовується для отримання списку сигналів, існуючих в системі в символьній і числовій формах.
В багатьох операційних системах передбачені ще і додаткові опції для команди kill.
При використовуванні системного виклику kill() послати сигнал (не маючи повноважень суперкористувача) бути можна тільки процесу або процесам, у яких ефективний ідентифікатор користувача співпадає з ефективним ідентифікатором користувача процесу, що посилає сигнал.
Системний виклик kill()
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int signal);
Опис системного виклику
Системний виклик kill() призначений для передачі сигналу одному або декільком специфікованим процесам в рамках повноважень користувача.
Послати сигнал (не маючи повноважень суперкористувача) бути можна тільки процесу, у якого ефективний ідентифікатор користувача співпадає з ефективним ідентифікатором користувача для процесу, що посилає сигнал.
Аргумент pid описує, кому посилається сигнал, а аргумент sig – який сигнал посилається. Цей системний виклик уміє робити багато різних речей, залежно від значення аргументів:
Якщо pid > 0 і sig > 0, то сигнал номером sig (якщо дозволяють привілеї) посилається процесу з ідентифікатором pid.
Якщо pid = 0, а sig > 0, то сигнал з номером sig посилається всім процесам в групі, до якої належить посилаючий процес.
Якщо pid = -1, sig > 0 і посилаючий процес не є процесом суперкористувача, то сигнал посилається всім процесам в системі, для яких ідентифікатор користувача співпадає з ефективним ідентифікатором користувача процесу, що посилає сигнал.
Якщо pid = -1, sig > 0 і посилаючий процес є процесом суперкористувача, то сигнал посилається всім процесам в системі, за винятком системних процесів (звичайно всім, окрім процесів з pid = 0 і pid = 1).
Якщо pid < 0, але не –1, sig > 0, то сигнал посилається всім процесам з групи, ідентифікатор якої рівний абсолютному значенню аргументу pid (якщо дозволяють привілеї).
Якщо значення sig = 0, то проводиться перевірка на помилку, а сигнал не посилається, оскільки всі сигнали мають номери > 0. Це можна використовувати для перевірки правильності аргументу pid (чи є в системі процес або група процесів з відповідним ідентифікатором).
Значення, що повертається
Системний виклик повертає 0 при нормальному завершенні і –1 при помилці.