Signaali (tietotekniikka)
Signaali on tietotekniikassa ohjelmallinen keskeytys. Signaaleja käytetään Unixeissa, Unixin kaltaisissa ja POSIX-yhteensopivissa käyttöjärjestelmissä asynkronisien tapahtumien välittämiseen.
Varhaisissa BSD ja AT&T -versioissa signaalit olivat epäyhteensopivia ja epäluotettavia. POSIX.1:stä lähtien käytössä on ollut standardoitu luotettava mekanismi signaalien välitykseen.
Esimerkkejä signaaleista ovat SIGKILL
(ohjelman lopettaminen) ja SIGSEGV
(muistiviittausvirhe). Tyypillisiä käyttäjän määrittämiä signaaleja ovat SIGUSR1
ja SIGUSR2
.
Signaalin välittäminen ohjelmalle keskeyttää ohjelman suorituksen signaalin käsittelyn ajaksi. Ohjelma voi toteuttaa signaalinkäsittelijäfunktion, jota kutsutaan oletustoteutuksen sijaan.
Esimerkki
Yksinkertainen esimerkki signaalin käsittelystä sovellusohjelmassa:
#include <signal.h>
int g_stop = 0;
void s_handler(int signo)
{
g_stop = 1; /* triviaali toiminto signaalin käsittelemiseksi */
}
int main()
{
if (signal(SIGUSR1, s_handler) < 0) /* aseta käsittelijäfunktio signaalille SIGUSR1 */
{
return -1;
}
while (g_stop == 0) /* tarkista.. */
{
sleep(100); /* ..odota */
}
return 0;
}
Esimerkissä s_handler()
on funktio, jota kutsutaan kun prosessille välitetään signaali SIGUSR1
. Käsittelijäfunktio ja signaalitunniste liitetään funktiolla signal()
.
Signaali voidaan antaa prosessille komennolla kill -SIGUSR1 pid
, jossa pid on prosessin tunnistenumero. Huomaa, että ohjelman pääsäie on odottamassa toistorakenteessa normaalin suorituksen ajan eikä kutsu käsittelijää itse suoraan lainkaan.
POSIX-yhteensopivissa alustoissa on tyypillisesti pause()
-funktio, jolla ohjelman suorituksen voi pysäyttää kunnes sille välitetään signaali.
Ongelmatilanteet
Signaalikonseptissa on mahdollista syntyä kilpatilanne, jossa prosessin tunnusnumero (ID) käytetään uudestaan eri prosessille.[1] Linuxiin on esitetty eri ratkaisuvaihtoehtoja toteutustavoille saman ongelman välttämiseen.[1] Linux-ytimen versiossa 5.1 on lisätty pidfd-rajapinta ongelman ratkaisuksi.[2]
Lähteet
- Stevens, W. Richard: Advanced Programming in the UNIX Environment. Addison-Wesley, 1993. ISBN 0201563177.
Viitteet
- Jonathan Corbet: Rethinking race-free process signaling 4.4.2019. LWN.net. (englanniksi)
- Linux 5.1 KernelNewbies. Viitattu 5.8.2019. (englanniksi)
Aiheesta muualla
- The Open Groupin määritelmä (englanniksi)
- PAUSE(2) – Linux Programmer's Manual (englanniksi)
- The Linux Signals Handling Model Linux Journalin verkkosivuilla (englanniksi)