Signaali (tietotekniikka)

Nykymaailmassa Signaali (tietotekniikka) on aihe, joka kiinnittää useiden ihmisten huomion ja kiinnostuksen ympäri maailmaa. Signaali (tietotekniikka):stä on tullut toistuva keskustelunaihe kaikkialla joko sen historiallisen merkityksen, nyky-yhteiskunnan vaikutuksen tai populaarikulttuurin vaikutuksen vuoksi. Poliittisista keskusteluista akateemisiin keskusteluihin Signaali (tietotekniikka) on edelleen kuuma aihe, joka herättää tunteita, mielipiteitä ja pohdintoja kaikilla elämänaloilla. Rajat ylittävän tärkeänä Signaali (tietotekniikka) on edelleen kiinnostava kohde kaikenikäisille ja -taustaisille henkilöille, ja se on vakiinnuttanut itsensä aiheena, joka herättää edelleen kiinnostusta ja keskustelua.

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. a b 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