Ishara kwenye mifupa ya programu ya linux. Kwa nini programu nyingi za Unix hutumia mawimbi kama USR1? Orodha ya utendakazi walioingia tena

Katika sehemu hii, tutazingatia hatua kwa hatua mchakato wa usindikaji wa ishara (kama vile kukatizwa) kutoka ulimwengu wa nje, pamoja na makosa ya programu. Hitilafu za programu hutokea hasa kutokana na makosa

ufikiaji wa kumbukumbu usiofaa, wakati wa kutekeleza maagizo maalum au kwa sababu ya shughuli za sehemu zinazoelea. Ishara zinazojulikana zaidi kutoka kwa ulimwengu wa nje: kukatiza(kukatiza) - ishara hii inatumwa unapobonyeza kitufe DEL; Utgång(acha) - inayotokana na ishara FS ( ctl-\); kuzimisha(hangup) - unaosababishwa na kukata simu, na kukamilika(kusitisha) - iliyotolewa na amri ya kuua. Wakati tukio moja la hapo juu linatokea, ishara hutumwa kwa michakato yote inayoendesha kutoka kwa terminal hiyo, na isipokuwa kama kuna kanuni zinazosema vinginevyo, mawimbi hukatisha mchakato. Ishara nyingi hutoa utupaji kumbukumbu, ambayo inaweza kuhitajika kwa utatuzi. (Angalia adb(1) na sdb(l).)

Simu ya mfumo wa mawimbi hubadilisha kitendo chaguo-msingi. Ina hoja mbili: ya kwanza ni nambari inayofafanua ishara, ya pili ni anwani ya kazi, au msimbo unaoagiza kupuuza ishara au kurejesha vitendo vya default. Faili ina maelezo ya hoja mbalimbali. Kwa hiyo,

#pamoja na

ishara(SIGINT, SIG_IGN);

husababisha usumbufu kupuuzwa wakati

ishara(SIGINT, SIG_DFL);

hurejesha kitendo chaguo-msingi - kumaliza mchakato. Katika hali zote, ishara inarudi thamani ya awali ya ishara. Ikiwa hoja ya pili ni jina la chaguo la kukokotoa (ambalo lazima litangazwe sawa faili ya chanzo), basi itaitwa wakati ishara itatokea. Matumizi ya kawaida ya kipengele hiki ni kuruhusu programu kujiandaa kutoka, kama vile kufuta faili ya muda:

#pamoja na

char *temfile = "temp.XXXXXX";

extern onintr();

mktemp (faili);

/* Inachakata... */ toka (0);

onintr() /* wazi ikiwa imeingiliwa */

tenganisha (faili); kutoka(1);

Kwa nini tunahitaji kuangalia na kupiga ishara tena kwa msingi? Kumbuka kwamba ishara zinatumwa kwa Wote michakato inayoendesha kwenye terminal hii. Ipasavyo, wakati programu haiendeshwi kwa maingiliano (lakini na &), kichakataji amri huiruhusu kupuuza kukatizwa, kwa hivyo programu haitasimamishwa na vikatizo vinavyokusudiwa kwa madhumuni yasiyo ya mwingiliano. michakato ya nyuma. Iwapo programu itaanza na tangazo kwamba vikatizo vyote lazima vitumwe kwa onintr, haijalishi ni nini, hii inapuuza jaribio hilo. processor ya amri Linda programu inayoendeshwa chinichini.

Suluhisho lililowasilishwa hapo juu hukuruhusu kuangalia hali ya usimamizi wa kukatiza na kuendelea kupuuza ukatizaji ikiwa ulipuuzwa hapo awali. Nambari inazingatia ukweli kwamba ishara inarudi hali iliyopita ishara maalum. Na ikiwa ishara zilipuuzwa hapo awali, mchakato utaendelea kuzipuuza; vinginevyo lazima waingizwe.

Programu changamano zaidi inaweza kutaka kukatiza ukatizaji na kutafsiri kama ombi la kughairi utendakazi unaoendelea na kurudi kwenye kitanzi chake cha amri. Chukua kichakataji maneno kwa mfano: kukatiza uchapaji kwa muda mrefu sana kusikufanye uondoke kwenye programu na kupoteza kazi yako yote. Katika hali hii, unaweza kuandika nambari ifuatayo:

#pamoja na

#pamoja na jmp_buf sjbuf;

ikiwa (signal(SIGINT, SIG_IGN) != SIG_IGN) ishara(SIGINT, onintr);

setjmp(sjbuf); /* hifadhi nafasi ya sasa kwenye mrundikano */ kwa (;;) (

/* kitanzi kikuu cha usindikaji */

onintr() /* weka upya ikiwa imeingiliwa */

ishara(SIGINT, onintr); /* weka upya kwa usumbufu unaofuata */ printf("\nKatiza\n");

longjmp(sjbuf, 0); /* rudi kwenye hali iliyohifadhiwa */ )

Faili setjmp.h inatangaza aina jmp_buf kama kitu ambamo nafasi ya rafu inaweza kuhifadhiwa; sjbuf inatangazwa kama kitu cha aina hii. Setjmp(3) chaguo za kukokotoa huweka rekodi ya mahali programu inapotekelezwa. Thamani zinazobadilika hazijahifadhiwa. Wakati usumbufu unapotokea, simu kwa programu ya onintr inaanzishwa, ambayo inaweza kuchapisha ujumbe, kuweka bendera, au kufanya kitu kingine. Kitendakazi cha longjmp hupokea kitu kilichohifadhiwa katika setjmp na kurudisha udhibiti kwa uhakika katika programu kufuatia simu ya setjmp. Kwa hivyo, udhibiti (na msimamo wa stack) unarudi kwenye hatua katika programu kuu ambapo kitanzi kikuu kinaingia.

Kumbuka kuwa ishara imewekwa kwa onintr tena baada ya usumbufu kutokea. Hii ni muhimu kwa sababu ishara, zinapopokelewa, hurejesha kiotomati kitendo cha chaguo-msingi.

Programu zingine haziwezi kusimamishwa wakati wowote, kwa mfano wakati wa usindikaji muundo tata data, kwa hivyo ni muhimu kuweza kugundua ishara. Labda suluhisho linalofuata- tunahitaji kufanya kidhibiti cha kukatiza kuweka bendera na kurudi badala ya kupiga simu kutoka au longjmp. Utekelezaji utaendelea kutoka mahali ulipokatizwa, na alama ya kukatiza inaweza kuangaliwa baadaye.

Kuna ugumu mmoja na mbinu hii. Wacha tufikirie kuwa programu inasoma kutoka kwa terminal wakati usumbufu unatumwa. Ratiba iliyobainishwa inaitwa ipasavyo, huweka bendera na kurudi. Ikiwa hii ndio kesi kama ilivyoonyeshwa hapo juu, ambayo ni kwamba, programu ingeanza tena utekelezaji "kutoka mahali pale ilipoingiliwa", basi programu ingelazimika kuendelea kusoma kutoka kwa terminal hadi mtumiaji atakapoandika laini mpya. Tabia hii inaweza kutatanisha kwa sababu huenda mtumiaji hajui programu inasoma nini, na pengine wangependelea mawimbi itekelezwe mara moja. Ili kutatua suala hili, mfumo unakamilisha kusoma, lakini kwa hali ya makosa ambayo inaonyesha kile kilichotokea; errno imewekwa kuwa EINTR, iliyofafanuliwa katika errno.h, ili kuashiria simu ya mfumo iliyokatizwa.

Kwa hivyo, programu ambazo hukata ishara na kuanza tena baada yao lazima ziwe tayari kwa "makosa" yanayosababishwa na simu za mfumo zilizoingiliwa. (Simu za mfumo za kuwa mwangalifu ni kusoma, kusubiri, na kusitisha.) Programu kama hiyo inaweza kutumia nambari iliyo hapa chini kusoma uingizaji wa kawaida:

#pamoja na extern int errno;

ikiwa (soma(0, &c, 1)<= 0) /* EOF или прерывание */

ikiwa (errno == EINTR) ( /* EOF iliyosababishwa na usumbufu */ errno = 0; /* weka upya kwa wakati ujao */

) mwingine ( /* mwisho halisi wa faili */

Na ujanja wa mwisho ambao unahitaji kulipa kipaumbele ikiwa utaftaji wa ishara umejumuishwa na utekelezaji wa programu zingine. Hebu tuchukue kwamba programu inashughulikia usumbufu na, kwa kuongeza, ina njia (kama! katika ed) ambayo programu nyingine zinaweza kutekelezwa. Kisha nambari itaonekana kama hii:

ikiwa (uma () == 0) execlp(...);

ishara(SIGINT, SIG_IGN); /* babu anapuuza kukatiza */

kusubiri(& hali); /* wakati mtoto anaendesha */ ishara(SIGINT, onintr); /* kurejesha kukatizwa */

Kwa nini iko hivi? Ishara hutumwa kwa michakato yako yote. Wacha tuchukue kuwa programu uliyoita inashughulikia kukatiza kwake yenyewe, kama vile mhariri anavyofanya. Ukikatiza programu ya mtoto, itapokea ishara na kurudi kwenye kitanzi chake kikuu, na pengine kusoma terminal yako. Lakini programu ya kupiga simu pia itaamka kutoka kwa kungojea programu ya mtoto na kusoma terminal yako. Kuwa na michakato miwili ya usomaji wa mwisho kunachanganya mambo, kwani mfumo unageuza sarafu ili kuamua ni programu gani itapokea kila safu ya ingizo. Ili kuepuka hili, programu ya mzazi inapaswa kupuuza kukatizwa hadi mtoto atekeleze. Hitimisho hili linaonyeshwa katika usindikaji wa ishara katika mfumo:

#pamoja na

mfumo (s) /* tekeleza mstari wa amri s */ char *s;

int status, pid, w, tty;

int (*istat)(), (*qstat)();

ikiwa ((pid = uma()) == 0) (

execlp("sh", "sh", "-c", s, (char *) 0); kutoka (127);

istat = ishara(SIGINT, SIG_IGN); qstat = ishara(SIGQUIT, SIG_IGN);

wakati ((w = subiri(&status)) != pid && w != –1)

ikiwa (w == -1) hali = -1;

ishara(SIGINT, istat); ishara(SIGQUIT, qstat); hali ya kurudi;

Kama kando, kazi ya ishara inaonekana ina hoja ya pili ya kushangaza. Kwa kweli ni kielekezi cha chaguo za kukokotoa ambacho hurejesha nambari kamili, na pia ni aina ya utendaji wa ishara-nal yenyewe. Thamani mbili, SIG_IGN na SIG_DFL, ni za aina sahihi, lakini zimechaguliwa ili zisilingane na utendakazi wowote halisi unaowezekana. Kwa wale wanaopendezwa hasa, hapa ni mfano wa jinsi wanavyoelezwa kwa PDP-11 na VAX; maelezo yanapaswa kuwa ya kuchukiza vya kutosha kuhimiza matumizi ya ishara.h.

#fafanua SIG_DFL (int (*)())0

#fafanua SIG_IGN (int (*)())1

ishara za kengele

Kengele ya simu ya mfumo ( n) husababisha mawimbi ya SIGALRM kutumwa kwa mchakato wako kupitia n sekunde Mawimbi ya kengele yanaweza kutumika ili kuhakikisha kuwa jambo fulani limetokea ndani ya muda ufaao. Jambo likitokea, SIGALRM inaweza kuzimwa; ikiwa sivyo, mchakato unaweza kurejesha udhibiti kwa kupokea ishara ya kengele.

Ili kuelezea hali hiyo, fikiria programu inayoitwa wakati wa kuisha, inaendesha amri nyingine; ikiwa amri hii haijakamilika kwa wakati fulani, itaacha wakati kengele itazimwa. Kwa mfano, kumbuka amri ya watchfor kutoka Sura ya 5. Badala ya kuiendesha kwa muda usiojulikana, unaweza kuweka kikomo cha saa:

$ muda umeisha -3600 watchfor dmg &

Msimbo katika muda wa kuisha unaonyesha karibu kila kitu kilichojadiliwa katika sehemu mbili zilizopita. Mtoto ameumbwa; babu huweka kengele na kusubiri mtoto amalize kazi yake. Ikiwa kengele inakuja mapema, mtoto huharibiwa. Jaribio linafanywa kurudisha hali ya kutoka kwa mtoto.

/* kuisha kwa muda: huweka kikomo cha muda kwa mchakato */

#pamoja na

#pamoja na

int pid; /* kitambulisho cha mchakato wa mtoto */

char *progname; kuu (argc, argv)

int sec = 10, hali, onalarm();

progname = argv;

ikiwa (argc > 1 && argv == ‘–’) ( sec = atoi(&argv);

argc––; argv++;

ikiwa (argc< 2)

error("Matumizi: %s [-10] amri", progname); ikiwa ((pid=uma()) == 0) (

execvp(argv, &argv); error("haikuweza kuanza %s", argv);

ishara(SIGALRM, onalarm); kengele (sekunde);

ikiwa (subiri(&status) == -1 || (hadhi & 0177) != 0) hitilafu("%s imeuawa", argv);

toka((hadhi >> 8) & 0377);

onalarm() /* kusitisha mchakato wa mtoto ikiwa kengele itapokelewa */

kuua(pid, SIGKILL);

Zoezi 7.18. Je, unaweza kukisia jinsi usingizi unatekelezwa? Kidokezo: pause(2). Katika hali gani (ikiwa ipo) inaweza kulala na kengele kuingilia kati? ~

Historia na biblia

Haijawasilishwa kwenye kitabu maelezo ya kina utekelezaji wa mfumo wa UNIX, hasa kutokana na ukweli kwamba kuna haki za umiliki wa kanuni. Karatasi ya Ken Thompson "Utekelezaji wa UNIX", iliyochapishwa katika BSTJ mnamo Julai 1978, inaelezea mawazo ya kimsingi. Mada sawa yanafufuliwa katika makala "Mfumo wa UNIX - retrospective" katika suala sawa

"BSTJ" na "Mageuzi ya mfumo wa kugawana wakati wa UNIX" ( Maendeleo ya UNIX- mifumo ya kugawana wakati), iliyochapishwa katika nyenzo za Kongamano la Usanifu wa Lugha na Mbinu ya Utayarishaji katika jarida la Springer-Verlag "Maelezo ya Mihadhara katika Sayansi ya Kompyuta"

Nambari 79 ya 1979. Kazi zote mbili ziliandikwa na Dennis Ritchie.

Programu ya kusoma polepole ilivumbuliwa na Peter Weinberger kama a dawa rahisi kuonyesha mchezo wa chess kwa watazamaji Programu za Belle Ken Thomson na Joe Condon wakati wa mashindano ya chess. Belle aliandika hali ya mchezo kwenye faili; waangalizi walichagulia faili kwa kutumia readslow ili kuepuka kuchukua mizunguko mingi ya thamani. ( Toleo jipya Vifaa vya Belle hufanya hesabu ndogo kwenye mashine ya mwenyeji wake, kwa hivyo shida hii haipo tena.)

Tom Duff alituongoza kuandika jina. Kifungu "Marekebisho ya tahajia katika violesura vya mtumiaji" na Ivor Durham, David Lamb na James Saxe violesura vya mtumiaji), iliyochapishwa na CACM mnamo Oktoba 1983, ni mradi tofauti kidogo wa kutekeleza urekebishaji wa tahajia katika muktadha wa programu ya barua pepe.

Ishara ni kukatizwa kwa programu. Zinatumika kwa mawasiliano kati ya michakato katika UNIX na mifumo ya uendeshaji kama UNIX kama vile Linux, Mac OS.

Mawimbi yamekuwa yakitumika tangu Bell Labs UNIX mwaka wa 1970 na sasa yanafafanuliwa rasmi na kiwango cha POSIX. Wakati ishara inafika kwenye mchakato, mfumo wa uendeshaji hukatiza mtiririko wa kawaida wa utekelezaji wa mchakato na hutoa arifa.

Haijalishi ni mfumo gani wa uendeshaji unaotumia, bila shaka utapata uzoefu wa programu zako kuzuiwa na kukataa kufanya kazi ipasavyo. Katika Unix, Linux, kuna amri ya "kuua" ambayo unaweza kutumia kuua mchakato mara moja, lakini si hivyo tu, lakini nitazungumzia kuhusu hilo baadaye kidogo. Katika makala hii "Ua Amri katika Unix / Linux" nitaelezea na kukuonyesha jinsi ya mifano iliyotengenezwa tayari amri mbalimbali za matumizi ya kuua.

Ua Amri na Ishara

Unapotoa amri ya kuua, kwa kweli unatuma ishara kwa mfumo na kuiamuru kusitisha programu iliyovunjika. Kuna jumla ya ishara 60 zinazoweza kutumika, lakini unachohitaji kujua ni SIGTERM (15) na SIGKILL (9).

Unaweza kutazama ishara zote kwa kutumia amri:

# kuua -l

Kwenye MacOS yangu:

Nitajaribu kuzungumza juu ya ishara zote, lakini kwanza tutazungumzia tu kuhusu muhimu zaidi na zinazotumiwa mara kwa mara.

Ishara za msingi

Ishara zifuatazo ni sehemu ya kiwango cha POSIX. Kila ishara ni macro iliyofafanuliwa ndani Faili ya kichwa cha mfumo. Kwa kawaida hufupishwa bila kiambishi chao cha SIG; kwa mfano SIGHUP mara nyingi hujulikana kama HUP.

SIGTERM- Ishara hii inaomba kusimamisha mchakato unaoendelea. Ishara hii inaweza kupuuzwa. Mchakato unapewa muda wa kuzima vizuri. Programu inapozima vizuri, inamaanisha kuwa imepewa muda wa kuokoa maendeleo yake na kutoa rasilimali. Kwa maneno mengine, "haikulazimisha" mchakato huo kusitisha.

SIGKILL- Ishara ya SIGKILL husababisha mchakato kuacha kufanya kazi yake mara moja. Programu haiwezi kupuuza ishara hii. Maendeleo ambayo hayajahifadhiwa yatapotea.

Syntax ya "kuua".

Syntax ya amri ni:

# kuua PID

# kill [-s] [-l] %pid

Ishara chaguo-msingi (ikiwa haijabainishwa) ni SIGTERM. Wakati ishara hii haisaidii na haifanyi kazi, unaweza kutumia chaguzi zifuatazo za "kuua" ili kusitisha mchakato kwa nguvu:

# kuua SIGKILL PID

# kuua -9 PID

ambapo "-9" ni bendera inayorejelea ishara ya SIGKILL.

Ikiwa haujui ni PID gani ya kutumia kwa programu unayotaka kuiondoa, basi endesha amri:

$ps -aux

Na kama unajua maombi maalum(kwa mfano, apache), basi unaweza kupalilia isiyo ya lazima na kuonyesha michakato yote ya huduma hii:

$ ps -aux | grep apache

Na itaonyesha kila kitu kuendesha maombi pamoja na PID zake.

Kwa mfano, kuua programu, ninaendesha amri ifuatayo:

# kuua -9 3629

Inafaa pia kuzingatia kuwa unaweza kuwa na michakato mingi inayoendesha kwa wakati mmoja ili "kuuawa":

# kuua -9 PID1 PID2 PID 3

Pakia upya faili za usanidi au anza upya huduma:

# kuua -1 nambari_ya_PID

Hasa ishara muhimu ni pamoja na HUP, INT, kill, STOP, CONT, na 0.

Chaguzi ni:

-s ishara_jina
Jina la ishara ambalo hubainisha mawimbi ya kutuma ishara isiyo chaguomsingi.

-l
Ikiwa operand haijainishwa, basi onyesha majina ya ishara; Vinginevyo, andika jina la ishara inayolingana na exit_status.

-signal_jina
Jina la ishara ambalo hubainisha mawimbi ya kutuma kwa TERM kwa chaguomsingi.

-nambari_ya_maisha
Nambari kamili ya desimali isiyo hasi inayobainisha mawimbi chaguomsingi ya kutuma kwa TERM.

PID zifuatazo zina maana maalum:
-1 Ikiwa mtumiaji mkuu, basi hutangaza ishara kwa michakato yote; vinginevyo inatangaza kwa michakato yote-
kwa mtumiaji.

Baadhi ya ishara zinazotumiwa sana ni:

  • 1 HUP (kata simu) - shika simu.
  • 2 INT (interrupt) - usumbufu.
  • 3 ACHENI (acha) - toka.
  • 6 ABRT (utoaji mimba) - usumbufu.
  • 9 KUUA (kuua isiyoweza kupatikana, isiyopuuzwa)
  • ALRM 14 ( Saa ya Kengele) - kengele.
  • 15 TERM (ishara ya kusitisha programu) - Programu ya kusitisha ishara.

PKill

Amri ya "pkill" hukuruhusu kutumia mifumo ya hali ya juu ya misemo ya kawaida na vigezo vingine vinavyolingana. Badala ya kutumia PID, sasa unaweza kuua programu kwa kuingiza jina la mchakato. Kwa mfano, kuua kivinjari cha Firefox, endesha tu amri:

#pkill Firefox

Kwa sababu inafanana na muundo kujieleza mara kwa mara, unaweza pia kuingiza sehemu ya jina la mchakato, kama hii:

#pkillfire

Ili kuzuia "kuua" michakato isiyo sahihi, unaweza kufanya "pgrep -l [process_name]" kuorodhesha michakato inayostahiki.

Amri ya pkill ina chaguo nyingi zaidi, kwa mfano ukibainisha chaguo la "-u" itakuruhusu kutaja jina la mtumiaji au kitambulisho. Katika mfano huu, tunatuma mawimbi ya TERM kwa michakato yote inayomilikiwa na mtumiaji 'hakuna mtu':

# pkill -u hakuna mtu

Killall

Killall hutumia jina la mchakato badala ya PID, na "inaua" hali zote za mchakato kwa jina moja. Kwa mfano, ikiwa unatumia matukio mengi Kivinjari cha Firefox, unaweza kuwaua wote kwa amri:

#ua firefox

Kwenye Gnome, unaweza kuanza tena Nautilus kwa amri:

#killallnautilus

xkill

Xkill ni kwa picha"kuua" maombi. Unapoingiza "XKill" kwenye terminal, kishale cha panya kitakuwa "msalaba" mara moja. Unachohitajika kufanya ni kubonyeza "msalaba" kwenye programu inayokera na itaua programu hiyo papo hapo. Ikiwa una nia, unaweza kuongeza njia ya mkato ya kibodi ili kuwezesha kipengele cha XKill.

Ishara zingine zinazotumiwa

SIGABRT

Ishara hii hutuma ishara kwa mchakato wa kukomesha operesheni. ABRT kwa kawaida huelekezwa kwenye mchakato yenyewe inapoita kitendakazi cha lugha ya programu ya C abort() kuashiria kusitishwa kusiko kwa kawaida, lakini inaweza kuelekezwa kutoka kwa mchakato wowote kama ishara nyingine yoyote.

SIGALRM, SIGVTALRM na SIGPROF

ALRM, VTALRM na/au mawimbi ya PROF hutumwa kwa mchakato wakati kikomo cha muda kilichobainishwa na simu kwa kipengele cha kukokotoa kengele (kama vile kiweka wakati) kimeisha muda.

ALRM

Imetumwa wakati saa au saa iliyopo inapita.

VTALRM

Imetumwa wakati muda wa CPU unaotumiwa na mchakato umekwisha.

PROF

Imetumwa wakati muda wa CPU unaotumiwa na mchakato na mfumo kwa niaba ya mchakato umekwisha.

SIGBUS

Ishara ya BASI inatumwa kwa mchakato inaposababisha hitilafu ya basi. Masharti yanayosababisha mawimbi haya, kama vile upataji wa kumbukumbu kimakosa au kukosa anwani ya mahali.

SIGCHLD

Ishara ya CHLD inatumwa kwa mchakato wakati mchakato wa mtoto unakatishwa, umekatizwa, au unaanza tena baada ya kukatizwa. Matumizi moja ya kawaida ya mawimbi ni kuashiria OS kusafisha rasilimali ambazo zinatumiwa na mchakato wa mtoto baada ya kukamilika, bila simu ya wazi ya mfumo.

SIGCONT

Ishara ya CONT inaelekeza mfumo wa uendeshaji kuanzisha upya mchakato ambao hapo awali ulisimamishwa na ishara ya STOP au TSTP. Moja ya vipengele muhimu Ishara hii ni udhibiti wa kazi kwenye ganda la Unix.

SIGFPE

Ishara ya FPE inatumwa kwa mchakato inapofanya shughuli za hesabu zenye makosa, kama vile kugawanya kwa sifuri.

SGHUP

Ishara ya HUP inatumwa kwa mchakato wakati terminal yake ya udhibiti imefungwa. Hapo awali iliundwa ili kuarifu mchakato baada ya kushuka kwa mstari mfululizo (HUP inayohusika na hangs). KATIKA mifumo ya kisasa, mawimbi haya kwa kawaida humaanisha kuwa udhibiti bandia au wa mwisho umefungwa.

SIGILL

Ishara ya ILL inatumwa kwa mchakato inapojaribu kutekeleza amri hasidi, zisizojulikana, au za upendeleo (maagizo).

SIGINT

Ishara ya INT inatumwa kwa mchakato kutoka kwa terminal ya kudhibiti wakati mtumiaji anataka kusitisha mchakato. Hii kwa kawaida huanzishwa kwa kubonyeza Control-C, lakini kwenye baadhi ya mifumo, "futa" au "break".

SIGKILL

Ishara ya KILL inatumwa kwa mchakato wa kuacha kufanya kazi mara moja. Tofauti na SIGTERM na SIGINT, mawimbi haya hayawezi kunaswa au kupuuzwa, na mchakato wa kupokea hauwezi kufanya usafishaji wowote baada ya kupokea mawimbi haya.

SIGPIPE

Ishara ya PIPE inatumwa kwa mchakato wakati inajaribu kuandika kwenye bomba bila mchakato uliounganishwa na mwisho mwingine.

SIGQUIT

Ishara ya QUIT inatumwa kwa mchakato kutoka kwa terminal yake ya kudhibiti wakati mtumiaji anaomba mchakato wa kutupa.

SIGSEGV

Ishara ya SEGV inatumwa kwa mchakato inapofanya rejeleo batili ya kumbukumbu pepe au hitilafu ya sehemu, yaani, inapofanya ukiukaji wa sehemu.

SIGSTST

Mawimbi ya STOP huiambia OS isitishe mchakato ili iweze kuanza tena baadaye.

SIGTERM

Ishara ya TERM inatumwa kwa mchakato wa kuomba ikomeshwe. Tofauti na ishara ya "kuua", inaweza kufasiriwa au kupuuzwa wakati wa mchakato. Hii inaruhusu mchakato wa kutekeleza utekelezaji "mzuri" ili kuacha kutoa rasilimali na kuokoa hali ikiwa ni lazima. Ikumbukwe kuwa SIGINT inakaribia kufanana na SIGTERM.

SIGTSTP

Ishara ya TSTP inatumwa kwa mchakato wake wa udhibiti wa terminal na kuiambia kusimamisha kwa muda. Hii kawaida huanzishwa na mtumiaji akibofya Control-Z. Tofauti na SIGSTOP, mchakato huu unaweza kusajili kidhibiti cha mawimbi au kupuuza mawimbi.

SIGTTIN na SIGTTOU

Alama za TTIN na TTOU hutumwa kwa mchakato inapojaribu kusoma au kuandika, mtawalia, kutoka kwa terminal ya (tty) nyuma. Kama sheria, ishara hii inaweza kupatikana tu kwa kutumia michakato iliyo chini ya udhibiti jopo la kufanya kazi; damoni hazina vituo vya kudhibiti na hazipaswi kamwe kupokea ishara hii.

SIGUSR1 na SIGUSR2

Mawimbi ya USR1 na USR2 hutumwa kwa mchakato na kuashiria mtumiaji amefafanuliwa masharti.

SIGPOLL

Ishara ya POLL inatumwa kwa mchakato wakati tukio la I/O lisilosawazisha linatokea.

SIGSYS

Ishara ya SYS inatumwa kwa mchakato wakati inapitisha hoja mbaya kwa simu ya mfumo.

SIGTRAP

Ishara ya TRAP inatumwa kwa mchakato wakati hali inapotokea ambayo kitatuzi kimeomba kufahamishwa—kwa mfano, wakati kipengele fulani cha kukokotoa kinapotekelezwa au wakati thamani fulani ya kigeuzi inabadilika.

SIGURG

Ishara ya URG inatumwa kwa mchakato wakati soketi ina data ya dharura au nje ya masafa inayopatikana kwa kusoma.

SIGXCPU

Ishara ya XCPU inatumwa kwa mchakato inapotumia CPU kwa zaidi ya muda fulani kuweka thamani, imewekwa na mtumiaji. Kuwasili kwa ishara ya XCPU inaruhusu mchakato wa kuokoa haraka kila kitu matokeo ya kati na hutoka vizuri kabla ya kuuawa na mfumo wa uendeshaji kwa kutumia ishara ya SIGKILL.

SIGXFSZ

Ishara ya XFSZ inatumwa katika mchakato wakati faili inakua kubwa (inazidi thamani maalum) kuliko thamani ya juu inayoruhusiwa.

SIGRTMIN kwa SIGRTMAX

Ishara za RTMIN - RTMAX zimekusudiwa kutumiwa kwa madhumuni maalum. Ni ishara za wakati halisi.

Ishara tofauti

Ishara zifuatazo hazijasanifishwa na POSIX, lakini wakati mwingine hutumiwa kwenye baadhi ya mifumo.

SIGEMT

Ishara ya EMT inatumwa katika mchakato wakati kiigaji kinakatizwa.

SIGINFO

Ishara ya INFO inatumwa ikiendelea wakati ombi la hali linapokelewa kutoka kwa terminal ya kudhibiti.

SIGPWR

Mawimbi ya PWR hutumwa kwa mchakato wakati mfumo unakumbwa na hitilafu ya nishati.

SIGLOST

Ishara ya LOST inatumwa kwa mchakato wakati "kufunga faili" kunapotea.

SIGWINCH

Ishara ya WINCH inatumwa kwa mchakato wakati terminal yake ya udhibiti inabadilisha ukubwa wake.

Inatuma ishara kutoka kwa kibodi

Ishara zinaweza kutumwa kutoka kwa kibodi. Thamani kadhaa za kawaida za kawaida zimeorodheshwa hapa chini. Kwa chaguo-msingi, njia za mkato za kibodi za kutuma ishara za kukatiza zinaweza kuelezwa kwa kutumia amri ya stty.

CTRL-C

Tuma SIGINT (mkatisha). Kwa chaguo-msingi hii husababisha mchakato kukomesha.

CTRL-Z

Tuma SIGTSTP (Sitisha). Kwa chaguo-msingi, hii husababisha mchakato kusimamisha shughuli zote.

CTRL-\

Tuma SIGQUIT (Toka). Kwa chaguo-msingi, hii husababisha mchakato kusitishwa mara moja na kuweka upya kernel.

CTRL-T

Tuma SIGINFO (INFO). Kwa chaguo-msingi, hii inasababisha mfumo wa uendeshaji kuonyesha habari kuhusu amri. Haitumiki kwenye mifumo yote.

hitimisho

Programu zinapofanya vibaya na kusababisha mfumo kugandisha, inajaribu sana kuanzisha upya kompyuta yako na kuanzisha kipindi tena. Kwa amri hizi za "kuua", unaweza kudhibiti vyema tabia mbaya ya programu zinazosababisha au zinaweza kusababisha ajali ya mfumo. Kwa hili, nahitimisha mada hii"Amri ya kuua katika Unix/Linux."

Hebu sasa tuchunguze programu nyingine - 13–14-3.c:

/* Programu iliyo na usindikaji maalum wa mawimbi ya SIGINT */ #include #pamoja na /* Kazi my_handler ni kidhibiti maalum cha mawimbi */ void my_handler(int nsig)( printf("Pokea mawimbi %d, CTRL-C imebonyezwa\n", nsig); ) int main(void)( /* Weka jibu la mchakato kwa ishara SIGINT */ (batili) ishara(SIGINT, my_handler); /*Kuanzia hatua hii, mchakato utachapisha ujumbe kuhusu kutokea kwa ishara ya SIGINT */ while(1); rudisha 0; ) Kuorodhesha 13-14.3. Programu (13–14-3.c) iliyo na uchakataji maalum wa mawimbi ya SIGINT.

Mpango huu ni tofauti na mpango katika sehemu ya "Kuendesha Programu ambayo Inapuuza Ishara" SIGINT"kwa sababu inaleta usindikaji wa ishara SIGINT kipengele maalum. Andika, kukusanya na kuendesha programu hii, angalia majibu yake kwa vyombo vya habari muhimu< CTRL >Na na kwa vibonye< CTRL >Na<4>.

Marekebisho ya programu ya awali ya usindikaji maalum wa ishara za SIGINT na SIGQUIT

Rekebisha programu kutoka sehemu iliyotangulia ili iweze kuchapisha ujumbe kuhusu mibonyezo ya vitufe pia.< CTRL >Na<4>. Tumia kazi sawa kwa usindikaji wa ishara SIGINT Na SIGQUIT. Kukusanya na kuiendesha, angalia ikiwa inafanya kazi kwa usahihi. Utalazimika pia kuondoa programu kutoka kwa terminal nyingine na amri kuua.

Kurejesha jibu la awali kwa ishara

Kufikia sasa katika mifano tumepuuza thamani iliyorejeshwa na simu ya mfumo ishara (). Simu ya mfumo huu kwa hakika hurejesha kielekezi kwa kidhibiti cha mawimbi kilichotangulia, ikiruhusu jibu lililobatilishwa kwa mawimbi kurejeshwa. Fikiria mfano wa programu 13-14-4.c, ambayo inarudi majibu ya awali kwa ishara SIGINT baada ya usindikaji 5 wa mawimbi maalum.

/* Programu iliyo na uchakataji maalum wa mawimbi ya SIGINT, inayorudi kwa jibu asilia kwa mawimbi haya baada ya kuichakata mara 5 */ #pamoja na #pamoja na int i=0; /* Counter ya idadi ya usindikaji wa ishara */ batili (*p) (int); /* Kielekezi ambamo anwani ya kidhibiti cha mawimbi kilichotangulia itawekwa */ /* Kazi my_handler – kidhibiti maalum cha mawimbi */ void my_handler(int nsig)( printf("Pokea mawimbi %d, CTRL-C imebonyezwa\n", nsig); i = i+1; /* Baada ya usindikaji wa 5, tunarudisha majibu ya awali kwa mawimbi */ if(i == 5) (batili) ishara(SIGINT, p); ) int main(batili)( /* Tunaweka mwitikio wetu wa mchakato kwa ishara ya SIGINT, tukikumbuka anwani ya kidhibiti cha awali */ p = ishara(SIGINT, my_handler); /* Kuanzia hatua hii, mchakato utachapisha ujumbe kuhusu kutokea kwa ishara ya SIGINT. mara 5 */ wakati(1); rudisha 0; ) Kuorodhesha 13-14.4. Programu (13-14-4.c) iliyo na uchakataji maalum wa mawimbi ya SIGINT.

Andika, kusanya programu na uiendeshe.

Ishara SIGUSR1 na SIGUSR2. Kutumia ishara kusawazisha michakato

Katika mfumo wa uendeshaji wa UNIX kuna ishara mbili, vyanzo vya ambayo inaweza tu kuwa simu ya mfumo kuua () au amri kuua, ni ishara SIGUSR1 Na SIGUSR2. Kawaida hutumiwa kuhamisha habari kuhusu tukio ambalo limetokea kutoka kwa mchakato mmoja wa mtumiaji hadi mwingine kama njia za kuashiria mawasiliano.

Katika nyenzo za semina ya 5 (sehemu "Kuandika, kuandaa na kuendesha programu ya kuandaa mawasiliano ya pande mbili kati ya michakato inayohusiana kupitia bomba"), wakati mawasiliano ya michakato inayohusiana kupitia bomba ilizingatiwa, ilisemekana kuwa bomba ni njia ya mawasiliano ya unidirectional. na kwamba kwa kuandaa mawasiliano kupitia bomba moja katika pande mbili ni muhimu kutumia njia za maingiliano ya pamoja ya michakato. Panga mawasiliano ya kubadilishana ya njia mbili kati ya mchakato wa mzazi na mchakato wa mtoto kupitia bomba kwa kutumia ishara kwa maingiliano. SIGUSR1 Na SIGUSR2 kwa kurekebisha programu kutoka kwa sehemu. "Kuendesha mpango wa kupanga mawasiliano ya moja kwa moja kati ya michakato inayohusiana kupitia bomba" Semina ya 5.

Jukumu la juu: hamisha nambari kamili kati ya michakato miwili kwa kutumia ishara pekee SIGUSR1 Na SIGUSR2.

Wakati wa kutekeleza threads za utekelezaji katika chumba cha uendeshaji Mfumo wa Linux(Angalia Warsha 6–7, kuanzia na sehemu "Kuelewa thread katika UNIX. Kitambulisho cha mazungumzo ya utekelezaji. Kazi pthread_self() ") ishara SIGUSR1 Na SIGUSR2 hutumika kupanga ulandanishi kati ya michakato inayowakilisha nyuzi za utekelezaji na mchakato wa kuratibu kwa madhumuni rasmi. Kwa hiyo, programu za watumiaji zinazotumia nyuzi za utekelezaji katika kazi zao haiwezi kutumia ishara SIGUSR1 Na SIGUSR2.

Kukomesha mchakato wa kuzaliana. Waitpid() simu ya mfumo. Mawimbi SIGCHLD

Katika nyenzo za semina 3-4 (sehemu " Kumaliza mchakato. Toka () kazi ") wakati wa kusoma kusitisha mchakato, ilisemekana kwamba ikiwa mchakato wa mtoto utatoka kabla ya mchakato wa mzazi, na mchakato wa mzazi haujaonyesha wazi kuwa hana nia ya kupata habari kuhusu. hali ya kukamilika mchakato wa mtoto, basi mchakato uliokamilishwa haupotei kabisa kutoka kwa mfumo, lakini unabaki katika hali utendaji uliokamilika(mchakato wa zombie) ama hadi mchakato wa mzazi ukomeshwe, au hadi mzazi ajitoe kupokea taarifa hii.

Ili kupata taarifa kama hizo, mchakato wa mzazi unaweza kutumia simu ya mfumo waitpid() au umbo lake lililorahisishwa subiri (). Simu ya mfumo waitpid() huruhusu mchakato wa mzazi kupata taarifa kwa usawa kuhusu hali ya mchakato wa mtoto uliokatishwa, ama kwa kuzuia mchakato wa mzazi hadi mchakato wa mtoto ukomeshwe, au bila kuzuia unapoitwa mara kwa mara na chaguo la WNOHANG. Data hii inachukua hadi biti 16 na katika kozi yetu inaweza kusimbwa kama ifuatavyo:

Kila mchakato wa mtoto hutuma ishara maalum kwa mchakato wa mzazi wake wakati unatoka. SIGCHLD, ambayo michakato yote ina majibu chaguomsingi yaliyowekwa kuwa "puuza ishara". Uwepo wa ishara kama hiyo kwa kushirikiana na simu ya mfumo waitpid() hukuruhusu kupanga mkusanyiko usiolingana wa habari kuhusu hali ya michakato iliyokamilishwa na mchakato wa mzazi.

wait() na waitpid() simu za mfumo

Mifano simu za mfumo

#pamoja na #pamoja na pid_t waitpid(pid_t pid, int *hali, chaguzi za int); pid_t wait(int *status);

Maelezo ya simu za mfumo

Maelezo haya sio maelezo kamili ya simu za mfumo, lakini yanarekebishwa kuhusiana na kozi yetu. Kwa kupata maelezo kamili rejea Mwongozo wa UNIX.

Simu ya mfumo waitpid() huzuia utekelezwaji wa mchakato wa sasa hadi mchakato wake ulioanzishwa, kama inavyobainishwa na thamani ya kigezo cha pid, kukomesha au mchakato wa sasa upokee ishara ambayo ina jibu chaguo-msingi la "mwisho wa mchakato" au jibu maalum la kushughulikia. Ikiwa mchakato uliibuka maalum kwa parameter pid iko katika hali ya kumaliza wakati simu ya mfumo inatekelezwa, simu ya mfumo hurudi mara moja bila kuzuia mchakato wa sasa.

Kigezo cha pid kinabainisha mchakato wa mtoto ambao mchakato wa mzazi unasubiri kukomesha, kama ifuatavyo:

  • Ikiwa pid > 0, subiri mchakato ulio na kitambulisho cha pid kukomesha.
  • Ikiwa pid = 0, basi tunasubiri kusitishwa kwa mchakato wowote wa mtoto katika kikundi ambacho mchakato wa mzazi ni wa.
  • Ikiwa pid = -1, basi tunangojea kusitishwa kwa mchakato wowote uliotolewa.
  • Ikiwa pid< 0 , но не –1 , то ожидаем завершения любого порожденного процесса из группы , идентификатор которой равен thamani kamili kigezo cha pid.

Parameta ya chaguzi katika kozi yetu inaweza kuchukua maadili mawili: 0 na WNOHANG . Thamani ya WNOHANG inahitaji simu kurudi mara moja bila kuzuia mchakato wa sasa kwa hali yoyote.

Ikiwa simu ya mfumo hutambua mchakato wa mtoto uliokamilishwa kutoka kwa wale waliotajwa na parameter ya pid, basi mchakato huu huondolewa kwenye mfumo wa kompyuta, na taarifa kuhusu hali yake ya kukomesha huhifadhiwa kwenye anwani iliyotajwa kwenye parameter ya hali. Kigezo cha hali kinaweza kuwekwa NULL ikiwa maelezo haya hayana maana kwetu.

Mchakato uliokatishwa unapotambuliwa, simu ya mfumo hurejesha kitambulisho chake. Ikiwa simu ilipigwa na chaguo lililowekwa WNOHANG na mchakato uliotolewa uliobainishwa na pid upo lakini bado haujatoka, simu ya mfumo itarudi 0 . Katika visa vingine vyote inarudisha thamani hasi. Marejesho kutoka kwa simu inayohusishwa na kutokea kwa mawimbi yaliyochakatwa na mtumiaji yanaweza kutambuliwa kwa thamani ya kigeu cha mfumo errno == EINTR , na simu inaweza kupigwa tena.

Simu ya mfumo wa kusubiri ni kisawe cha simu ya mfumo wa waitpid yenye thamani za vigezo pid = -1 , chaguzi = 0 . mchakato unaozalishwa.

/* Programu iliyo na upokeaji wa taarifa zisizo sawa kuhusu hali ya michakato miwili iliyokamilishwa ya mtoto */ #pamoja na #pamoja na #pamoja na #pamoja na #pamoja na /* Kazi my_handler ni kidhibiti cha mawimbi ya SIGCHLD */ void my_handler(int nsig)( int status; pid_t pid; /* Tunapiga kura ya hali ya mchakato uliokamilika na wakati huo huo kujua kitambulisho chake */ if(( pid = waitpid(-1, &status, 0))< 0){ /* Если возникла ошибка – сообщаем о ней и продолжаем работу */ printf("Some error on waitpid errno = %d\n", errno); } else { /* Иначе анализируем статус завершившегося процесса */ if ((status & 0xff) == 0) { /* Процесс завершился с явным или неявным вызовом функции exit() */ printf("Process %d was exited with status %d\n", pid, status >> 8); ) vinginevyo ikiwa ((hadhi & 0xff00) == 0)( /* Mchakato uliuawa kwa ishara */ printf("Mchakato %d kuuawa kwa ishara %d %s\n", pid, hali &0x7f,(hali & 0x80 )? * Unda Сhild 1 */ if((pid = uma())< 0){ printf("Can\"t fork child 1\n"); exit(1); } else if (pid == 0){ /* Child 1 – завершается с кодом 200 */ exit(200); } /* Продолжение процесса-родителя – порождаем Сhild 2 */ if((pid = fork()) < 0){ printf("Can\"t fork child 2\n"); exit(1); } else if (pid == 0){ /* Child 2 – циклится, необходимо удалять с помощью сигнала! */ while(1); } /* Продолжение процесса-родителя – уходим в цикл */ while(1); return 0; } Orodha ya 13-14.5. Programu (13-14-5.c) iliyo na upokeaji wa taarifa kuhusu hali ya michakato miwili iliyokamilishwa ya mtoto. kuua na nambari yoyote ya ishara. Mchakato wa mzazi pia itakuwa muhimu kumaliza na amri kuua.

Ishara au usumbufu wa mtandaoni ni ujumbe ambao mfumo hutuma kwa mchakato au mchakato mmoja hutuma kwa mwingine. Wakati mchakato unapokea ishara, utekelezaji wa mpango wa mchakato unaingiliwa na udhibiti huhamishiwa kwa subroutine ya kidhibiti ishara (kazi). Baada ya kidhibiti cha mawimbi kutekelezwa, utekelezaji wa programu iliyokatizwa huanza tena kutoka mahali ilipokatizwa.

Mfumo wa uendeshaji hutoa idadi kubwa aina za ishara, lakini nyingi za aina hizi zimehifadhiwa kwa madhumuni ya mfumo - hizi ni ishara ambazo mfumo wa uendeshaji hutuma kwa mchakato. Hata hivyo, pia kuna ishara kwamba michakato inaweza kubadilishana kati yao wenyewe.

Jibu la chaguo-msingi kwa mawimbi mengi ni kusitisha mchakato uliopokea mawimbi, yaani, ikiwa mchakato unapokea ishara ambayo haijaundwa kushughulikia, mchakato wa kupokea hukoma. Walakini, kwa aina nyingi za ishara mchakato unaweza kusakinisha kidhibiti ishara iliyotolewa au kuweka kupuuza ishara hii.

Ikiwa mchakato uko katika hali ya "hiari" ya kusimamisha (inayosababishwa, kwa mfano, kwa kutekeleza simu ya mfumo wa usingizi), kisha kupokea ishara "kuamsha mchakato kutoka usingizi", bila kujali usindikaji wa ishara ulikuwa nini, simu ya mfumo wa usingizi huisha. mara moja.

Kidhibiti cha ishara katika mchakato kinaonekana kama kazi iliyo na mfano:

Utupu function_name(int sigtype);

Kigezo cha kazi hii ni aina ya ishara (kidhibiti sawa kinaweza kusakinishwa ili kusindika ishara za aina tofauti).

Kuweka kidhibiti chako cha mawimbi, kughairi, au kuweka mawimbi ya kupuuzwa, tumia simu ya mfumo wa mawimbi

Utendaji wa kidhibiti cha mawimbi ni kazi za kawaida C, wanaweza kufikia vigezo na vitendakazi vyote vinavyoonekana kimataifa. Hata hivyo, kwa kuwa hatujui ni wakati gani katika utekelezaji wa programu kazi ya kushughulikia itaitwa, ni lazima tuchukue tahadhari maalum wakati wa kufikia. miundo ya kimataifa data kutoka kwa kipengele hiki. Kwa vipengele vinavyochakata mitiririko, kuna hitaji lingine muhimu - kuingia tena. Kwa sababu kidhibiti cha mawimbi kinaweza kuitwa wakati wowote katika utekelezaji wa programu (na chini ya hali fulani, kidhibiti kingine cha mawimbi kinaweza kuitwa wakati ishara moja inachakatwa), vidhibiti lazima vitumie vitendaji ambavyo vinakidhi hitaji la aliyeingia tena, ambayo ni, inaweza kuitwa. wakati huo huo wakati tayari wameitwa mahali pengine kwenye programu. Kwa hakika, hitaji la mrejeshaji linakuja katika kuhakikisha kuwa kipengele cha kukokotoa hakitumii rasilimali zozote za kimataifa bila kuchukua tahadhari ili kusawazisha ufikiaji wa rasilimali hizi. Baadhi ya chaguo za kukokotoa za I/O, ikijumuisha printf() chaguo za kukokotoa, hazijaingizwa tena. Hii ina maana kwamba hitimisho la moja printf kazi() inaweza kutatiza utoaji wa chaguo za kukokotoa nyingine. Ifuatayo ni orodha ya utendakazi walioingia tena ambao ni salama kupiga simu kutoka kwa vidhibiti vya mawimbi.

Orodha ya utendakazi walioingia tena

posix_trace_event()

timer_getoverrun()

Mchakato unaweza kutuma ishara kwa mchakato mwingine wowote ambao PID inaujua kwa kutumia simu ya mfumo wa kuua (licha ya jina lake la kutisha, simu ya mfumo huu sio lazima kuua mchakato ambao inashughulikiwa). Katika baadhi ya matukio, mchakato unaweza kuhitaji kutuma mawimbi yenyewe; hii inaweza kufanywa kwa kutumia simu ya kuongeza mfumo.

Aina fulani za ishara

Aina za mawimbi hutambuliwa kwa nambari za nambari, lakini upangaji programu mara nyingi hutumia majina ya ishara yaliyofafanuliwa katika mfumo ni pamoja na faili. Ifuatayo ni baadhi ya majina ya ishara yanayotumiwa sana:

Ishara hii husababisha mchakato ulioipokea kusitishwa. Hii ndiyo ishara pekee ambayo haiwezi kupuuzwa na ambayo huwezi kukabidhi kidhibiti chako mwenyewe

Ishara hii ni ombi la kusitisha mchakato. Utoaji wa ishara hii, kwa mfano, ni pamoja na amri (sio simu ya mfumo!) kill . Mchakato unaopokea mawimbi hii unatarajiwa kuisha, lakini mchakato unaweza kuchagua kupuuza mawimbi au kukabidhi kidhibiti chake.

Mfumo hutuma ishara hii kwa mchakato wa mzazi wakati mchakato wowote wa mtoto wake utakatizwa. Jibu chaguo-msingi kwa ishara hii ni kuipuuza. Mchakato wa mzazi hauwezi kujali kuchakata mawimbi haya isipokuwa inataka kuitumia kusawazisha utekelezaji wake na mchakato wa mtoto.

Ishara hii hutumiwa kuhesabu vipindi vya wakati. Mchakato unaweza kuweka muda wa muda kwa kutumia kengele au simu za mfumo wa kidhibiti, na baada ya muda wake kuisha muda maalum mfumo utamtumia ishara ya SIGALRM.

SIGUSR1 na SIGUSR2

Hakuna ishara zilizohifadhiwa nyuma ya ishara hizi. kazi za mfumo. Taratibu zinaweza kutuma ishara hizi kwa kila mmoja na kuzitafsiri jinsi zinavyoona inafaa.

Kwa maelezo zaidi kuhusu aina za mawimbi, angalia maelezo ya kazi

Programu nyingi za Unix hukubali mawimbi kama vile USR1 na USR2. Kwa mfano, kusasisha faili inayoweza kutekelezwa kwa Nginx on the fly, unatuma kill -USR2 .

Uelewa wangu ni kwamba USR1 ni ishara "iliyofafanuliwa na mtumiaji", ambayo inamaanisha kuwa yeyote aliyeunda programu anaweza kuitumia kumaanisha "kufunga" au "kupakua kumbukumbu zako" au "chapisha foo mara elfu" au chochote. Lakini sielewi kwa nini wanapaswa kutumia jina hili la kiholela. Kwa nini usiue -UPGRADE , au kuua -GRACEFUL_SHUTDOWN ? Je, Unix ina ishara fulani pekee?

Wakati tuko, Nginx pia hutumia ishara zifuatazo (tazama hati):

  • TERM, INT: kuzima haraka
  • ACHENI: kukamilika kwa neema
  • HUP:
    • Anzisha tena Usanidi
    • Anzisha mtiririko mpya wa kazi na usanidi mpya
    • Inazima kwa uzuri mtiririko wa kazi wa zamani
  • USR1: fungua faili za kumbukumbu
  • USR2: sasisha utekelezi kwenye kuruka
  • WINCH: Sitisha mtiririko wa kazi kwa neema

HUP? Winchi? Sababu ya majina haya ni nini? Ninaweza kupata wapi zaidi kuhusu hili?

6 majibu

Ishara zinazopatikana kwenye OS zinafafanuliwa na OS (kawaida baada ya POSIX) - sio "kamba" lakini nambari kamili zilizo na majina ya kawaida. USR1 na USR2 ni ishara mbili ambazo hazina maana maalum, zinazokusudiwa matumizi yoyote ya kiholela ambayo msanidi anataka.

Juu yako Mashine ya Linux soma ishara ya man 7 kwa muhtasari wa usindikaji wa ishara na ishara.

Unaweza kubatilisha maana ya ishara zingine ikiwa uko tayari kufanya kazi na Mfumo wa Uendeshaji kutoa mawimbi hayo kwa kujibu matukio. Unaweza, kwa mfano, kufanya HUP kumaanisha "pakia upya usanidi" - ikiwa una uhakika kuwa mchakato hautawahi kupata hang (hasara ya terminal) au uko tayari kushughulikia kesi ambapo OS, badala ya mtumiaji, hutuma. ishara ya HUP.

HUP haifai kwa kuelea. Ishara hii inatumwa kwa mchakato ikiwa terminal yake ya udhibiti inafikia mwisho wa faili. Hapo awali, vituo vya udhibiti viliunganishwa kwa kawaida kwenye bandari za mfululizo, labda kupitia laini ya modemu laini ya simu. Kama uhusiano wa simu imewashwa, modemu ya ndani itapunguza laini ya Carrier Detect, na kusababisha ripoti ya ukamilishaji wa faili ya kernel kutumwa na ishara iliyopitishwa SGHUP.

WINCH haifai kwa "kubadilisha dirisha". Inatumwa kwa mchakato ikiwa terminal yake ya kudhibiti inabadilisha saizi. Kwa sababu za wazi, vituo vinavyoweza kubadilisha ukubwa kawaida ni vituo vya uwongo, ambavyo hatimaye huwakilishwa na emulator ya terminal inayoendesha katika mazingira ya madirisha (kama vile xterm).

Kwa sababu majina ya ishara ni sanifu (POSIX). Unaweza kuandika mauaji yako mwenyewe inayoweza kutekelezwa kuchukua -UPGRADE ikiwa unataka na kutoa ishara ya USR1, lakini mauaji ya kawaida ambayo huja na UNIX haitaitambua.

Vinginevyo, unaweza kuunda lakabu, kazi, au hati ya ganda ili kukutafsiria, kwa mfano kutumia jina la bash:

Lakabu kuboresha = "kuua -USR1"

Faili ya kichwa cha signal.h huonyesha majina ya ishara kwa thamani zao halisi zinazotegemea utekelezaji.

Kwa maneno ya WINCH nadhani ni chukizo kidogo. Hii ni ishara ambayo hutolewa kwa programu wakati ukubwa wa dirisha unabadilishwa (hasa wakati dirisha la udhibiti wao linabadilishwa).

Kutumia hii kufunga nyuzi za wafanyikazi kwa neema sio wazo nzuri isipokuwa unaweza kuhakikisha kuwa mchakato hautawahi kukimbia kwenye terminal. Najua itakuwa hadithi sana ikiwa ningeendesha maombi na ikaamua kughairi kazi yote ya kukimbia kwa sababu tu niliongeza dirisha :-)

Jaribu kill -l na upate jibu mwenyewe:

1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGSEGV 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 1415 SIGSTIGSTIG615 SIGSTIGST 1415) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGTSTP 28) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGTTOU 39 SIGWIG 2 TMIN 35) SIGRTMIN+ 1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 465) 1 SIGRTMIN+10 465) ) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRT59-15GRT ) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX