Prosessien väliset viestintäsignaalit

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 30.11.2020 tarkistetusta versiosta . tarkastukset vaativat 2 muokkausta .

Prosessien väliset viestintäsignaalit  ovat viestejä , jotka käyttöjärjestelmä lähettää prosessille tai yksi prosessi lähettää toiselle. Käyttäjän näkökulmasta, kun prosessi vastaanottaa signaalin, näyttää siltä, ​​että poikkeus (keskeytys) on tapahtunut. Kun prosessi vastaanottaa signaalin, prosessiohjelman suoritus keskeytyy ja ohjaus siirtyy alirutiinille (funktiolle) - signaalinkäsittelijälle. Kun signaalinkäsittelijä on suoritettu, keskeytetyn ohjelman suoritus jatkuu kohdasta, jossa se keskeytettiin. [1] [2]

Signaalityypit

Signaalityypit määritellään numeerisilla numeroilla, mutta ohjelmoinnissa käytetään yleensä system include -tiedostoissa määriteltyjä symbolisia nimiä (vakioita). Käyttöjärjestelmä tarjoaa suuren määrän erilaisia ​​signaaleja, mutta useimmat näistä tyypeistä on varattu järjestelmätarkoituksiin – nämä ovat signaaleja, jotka käyttöjärjestelmä lähettää prosessille. On kuitenkin myös signaaleja, joita prosessit voivat vaihtaa keskenään.

Käyttäjän valtuuksien rajoissa prosessi voi signaloida minkä tahansa muun prosessin, jonka PID se tietää, käyttämällä kill system -kutsua (huolimatta mahtavasta nimestä tämä järjestelmäkutsu ei välttämättä lopeta prosessia, jolle se on osoitettu).

#include <sys/types.h> #include <signal.h> int kill ( pid_t pid , int signaali );

Pid-argumentti määrittää prosessin, johon signaali lähetetään, ja signaali-argumentti määrittää, mikä signaali lähetetään.

  • jos pid > 0, signaali lähetetään prosessille id pid:llä;
  • jos pid = 0, signaali lähetetään kaikille prosesseille ryhmässä, johon lähetysprosessi kuuluu;
  • jos pid = −1 ja lähetysprosessi ei ole juuriprosessi, niin signaali lähetetään kaikille järjestelmän prosesseille, joiden käyttäjätunnus vastaa lähetysprosessin voimassa olevaa käyttäjätunnusta.
  • jos pid = −1 ja lähetysprosessi on juuriprosessi, niin signaali lähetetään kaikille järjestelmän prosesseille, paitsi järjestelmäprosesseille (yleensä kaikki paitsi prosessit, joissa pid = 0 ja pid = 1);
  • jos pid < 0, mutta ei −1, niin signaali lähetetään kaikille ryhmän prosesseille, joiden id on yhtä suuri kuin pid-argumentin itseisarvo (jos oikeudet sallivat);
  • jos signaali = 0, suoritetaan virhetarkistus eikä signaalia lähetetä. Tätä voidaan käyttää tarkistamaan, onko pid-argumentti kelvollinen (onko järjestelmässä prosessi tai prosessiryhmä, jolla on vastaava tunnus).
Signaalin tyyppi Kuvaus
SIGKILL Tämä signaali saa sen vastaanottaneen prosessin lopettamaan. Tämä on ainoa signaali, jota ei voida jättää huomiotta ja jolle et voi määrittää mukautettua käsittelijää.
SIGTERM Tämä signaali on pyyntö lopettaa prosessi. Tämän signaalin antaminen sisältää esimerkiksi komennon (ei järjestelmäkutsua!) kill. Tämän signaalin vastaanottaneen prosessin oletetaan poistuvan, mutta prosessi voi asettaa signaalin huomiotta tai määrittää sille oman käsittelijän.
SIGCHLD Järjestelmä lähettää tämän signaalin pääprosessille, kun jokin sen aliprosesseista päättyy. Oletusvaste tähän signaaliin ohitetaan. Pääprosessin ei tarvitse välittää tämän signaalin käsittelystä, ellei se halua käyttää sitä synkronoidakseen suoritustaan ​​aliprosessin kanssa.
SIGALRM Tätä signaalia käytetään aikavälien laskemiseen. Prosessi voi asettaa tietyn aikavälin käyttämällä hälytys- tai asetuskutsuja, ja määritellyn aikavälin kuluttua järjestelmä lähettää sille SIGALRM-signaalin.
SIGUSR1 ja SIGUSR2 Näille signaaleille ei ole varattu järjestelmämäärityksiä. Prosessit voivat lähettää nämä signaalit toisilleen ja tulkita niitä parhaaksi katsomallaan tavalla. [yksi]

Omien signaalinkäsittelijöiden asentaminen

Jos haluat määrittää mukautetun signaalinkäsittelijän, peruuttaa sen tai asettaa signaalin ohitettavaksi, käytä signaalijärjestelmän kutsua.

# sisältää <signal.h> void ( * signaali ( int sig , void ( * käsittelijä ) ( int )))( int );

Sig - parametri  on sen signaalin numero, jonka käsittelyä halutaan muuttaa. Käsittelijäparametri kuvaa uutta tapaa käsitellä signaalia - se voi olla osoitin käyttäjän määrittelemään signaalinkäsittelytoimintoon, erikoisarvo SIG_DFL (palauta prosessin oletuskäyttäytyminen sig-signaalissa) tai erikoisarvo SIG_IGN ( jättää huomioimatta saapuva merkkisignaali).

Järjestelmäkutsu palauttaa osoittimen vanhaan signaalinkäsittelytapaan, jonka arvolla voidaan tarvittaessa palauttaa vanha tapa. Prosessin signaalinkäsittelijällä on prototyypin funktio:

void funktion_nimi(int sigtype);

Tämän toiminnon parametri on signaalityyppi (sama käsittelijä voidaan asettaa käsittelemään eri tyyppisiä signaaleja).

Esimerkki SIGUSR1-signaalin mukautetusta käsittelystä.

void *my_handler(int nsig) { signaalinkäsittelijän toimintokoodi } int main() { (void) signaali (SIGUSR1, oma_käsittelijä); }

Käyttöjärjestelmä, jossa signaaleja voidaan käyttää

Signaaleja voidaan käyttää kaikissa Unix-järjestelmissä, kuten BSD, FreeBSD, GNU jne.

Ikkunoissa on pieni analogi, signaali () -toiminto CRT:stä, jonka signaaleista itse asiassa vain SIGINT voidaan käyttää aiottuun tarkoitukseen.

Muistiinpanot

  1. 1 2 UNIX-arkkitehtuuri. Prosessit Luku 1. Johdatus UNIX-käyttöjärjestelmään (kuollut linkki) . Haettu 11. toukokuuta 2016. Arkistoitu alkuperäisestä 5. kesäkuuta 2016. 
  2. Luento 8: Prosessien välisen viestinnän välineet . Haettu 11. toukokuuta 2016. Arkistoitu alkuperäisestä 2. kesäkuuta 2016.

Linkit