русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Шановні українці! Матеріал був перекладений з російської мови. Тому можуть бути незначні помикли...

Сигнали в linux. Приклади

Сигнали - загальні відомості

Сигнал або віртуальне переривання є повідомленням, яке система посилає процесу або один процес посилає іншого. Коли процес отримує сигнал, виконання програми процесу переривається, і керування передається на підпрограму (функцію) - обробник сигналу. Після виконання обробника сигналу виконання перерваної програми поновлюється з тієї точки, на якій пона була перервана.

В операційній системі передбачена велика кількість типів сигналів, але більшість з цих типів зарезервовано для системних цілей - це сигнали, які операційна система посилає процесу. Проте є і сигнали, якими ппроцессы можуть обмінюватися між собою.

За замовчуванням реакція на більшість сигналів - припинення процесу, отримав сигнал, тобто, якщо процес отримує сигнал, обробка якого ньому не передбачена, то процес-одержувач сигналу завершується. Однак для більшості типів сигналів процес може встановити обробник даного сигналу або встановити ігнорування цього сигналу.

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

Обробник сигналу в процесі має вигляд функції з прототипом:

 void имя_функции(int sigtype);

Параметром цієї функції є тип сигналу (один і той же обробник може бути встановлений для обробки сигналів різних типів).

Для установки свого обробника сигналу, для його скасування або для встановлення ігнорування сигналу використовується системний виклик signal

Опції-обробники сигналів - це звичайні функції Сі, вони мають доступ до всіх глобально видимим змінним і функцій. Однак, оскільки ми не знаємо, в який момент виконання програми буде викликана функція-обробник, ми повинні проявляти особливу обережність при зверненні до глобальних структур даних з цієї функції. Для функцій, обробних потоки, існує і ще одна важлива вимога - реентерабильность. Оскільки обробник сигналу може бути викликаний у будь-який точці виконання програми (а при не кототорых умовах під час обробки одного сигналу може бути викликаний інший обробник сигналу) в обробниках додлжны використовуватися функції, які задовольняють вимогу реентерабельности, тобто, можуть бути викликані в той час, коли вони вже викликані де-то в іншій точці програми. Фактично, вимога реентерабельности зводиться до того, щоб функція не використовувала жодних глобальних ресурсів, не переймаючись синхронізації доступу до цих ресурсів. Деякі функції введення-виведення, в тому числі, функція printf(), реентерабельными не є. Це означає, що висновку однієї функції printf() може перешкодити висновок іншої функції. Нижче наводиться список реентерабельных функцій, які безпечно викликати з обробників сигналів.

 

 

Список реентерабельных функцій

accept()

access()

aio_error()

aio_return()

aio_suspend()

alarm()

bind()

cfgetispeed()

cfgetospeed()

cfsetispeed()

fsetospeed()

chdir()

chmod()

chown()

clock_gettime()

close()

connect()

creat()

dup()

dup2()

execle()

execve()

_Exit()

_exit()

fchmod()

fchown()

fcntl()

fdatasync()

fork()

fpathconf()

fstat()

fsync()

ftruncate()

getegid()

geteuid()

getgid()

getgroups()

getpeername()

getpgrp()

getpid()

getppid()

getsockname()

getsockopt()

getuid()

kill()

link()

listen()

lseek()

lstat()

mkdir()

mkfifo()

open()

posix_trace_event()

pselect()

raise()

read()

readlink()

recv()

recvfrom()

recvmsg()

rename()

sendto()

setgid()

setpgid()

setsid()

setsockopt()

setuid()

shutdown()

sigaction()

sigaddset()

sigdelset()

sigemptyset()

sigfillset()

sigismember()

signal()

sigpause()

sigpending()

sigprocmask()

sigqueue()

sigset()

sigsuspend()

sleep()

socket()

socketpair()

stat()

symlink()

sysconf()

tcdrain()

tcflow()

tcflush()

tcgetattr()

tcgetpgrp()

tcsendbreak()

tcsetattr()

tcsetpgrp()

time()

timer_getoverrun()

timer_gettime()

timer_settime()

times()

umask()

uname()

unlink()

utime()

wait()

waitpid()

write()

 

Процес може послати сигнал будь-якого іншого процесу, PID якого йому відоме, за допомогою системного виклику kill (незважаючи на грізне назву, цей системний виклик не обов'язково вбиває той процес, якому він адресований). У деяких випадках процесу буває потрібно надіслати сигнал самому собі, це можна зробити за допомогою системного виклику raise.

 

 

Деякі типи сигналів

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

SIGKILL

 

Цей сигнал призводить до завершення отримав його процесу. Це єдиний сигнал, який не може ігноруватися і для якого не можна призначити власний обробник

SIGTERM

 

Цей сигнал - запит на завершення процесу. Видачу цього сигналу, наприклад, включає команда (не системний виклик!) kill. мається на увазі, що процес, який отримав цей сигнал, повинен завершитися, однак процес може встановити ігнорування цього сигналу або призначити для нього власний обробник.

SIGCHLD

 

Цей сигнал система посилає батьківського процесу при завершенні будь-якого його дочірнього процесу. Реакція на цей сигнал, встановлена за замовчуванням, - ігнорування. Батьківський процес не може піклуватися про обробці цього сигналу, якщо тільки він не хоче використовувати його для синхронізації свого виконання з дочірнім процесом.

SIGALRM

 

Цей сигнал використовується для відліку тимчасових інтервалів. Процес може встановити певний часовий інтервал за допомогою системних викликів alarm або setitimer, закінчення заданого інтервалу система пошле йому сигнал SIGALRM.

SIGUSR1 і SIGUSR2

 

За цими сигналами не зарезенвированы ніякі системні призначення. Процеси можуть посилати ці сигнали один одному та інтерпретувати їх за своїм розсуд.

докладніше про типи сигналів див. в описі функції signal.

Приклад виконання наведено тутДовідковий матеріал

Обрані системні виклики Linux/Unix. Короткий опис.

Довідник бібліотечних функція мови З: частина 1, частина 2 (кодування кирилиця ibm866).

Переглядів: 10974

Повернутися в зміст:ОС Linux




Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн