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 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.
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] |
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ä); }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.