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

Viitteet

  1. Jonathan Corbet: Rethinking race-free process signaling 4.4.2019. LWN.net. (englanniksi)
  2. Linux 5.1 KernelNewbies. Viitattu 5.8.2019. (englanniksi)

    Aiheesta muualla

    This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.