{"id":96,"date":"2004-05-01T18:18:15","date_gmt":"2004-05-01T18:18:15","guid":{"rendered":"https:\/\/143-42-55-146.ip.linodeusercontent.com\/?p=96"},"modified":"2004-05-01T18:18:15","modified_gmt":"2004-05-01T18:18:15","slug":"systa%c2%89mova%c2%89-vola%c2%81na%c2%8d-ja%c2%81dra-v-unixu","status":"publish","type":"post","link":"https:\/\/nax.cz\/?p=96","title":{"rendered":"SYST\u0102\u0089MOV\u0102\u0089 VOL\u0102\u0081N\u0102\u008d J\u0102\u0081DRA V UNIXU"},"content":{"rendered":"<p>No tedy j\u0102\u0104 tenhle blog vedu. Teda sp\u0102\u00ad\u0139\u0104 ve \u0139\u0104kole je to docela n\u0102\u0104ro\u00c4\u008dn\u0102\u0160. Nebo sp\u0102\u00ad\u0139\u0104 si to ve \u0139\u0104kole trochu n\u0102\u0104ro\u00c4\u008dn\u0102\u0160 d\u00c4\u009bl\u0102\u0104m. V uplynul\u0102\u0160m t\u0102\u02dddnu mne pln\u00c4\u009b vyt\u00c4\u009b\u0139\u017eovala semestr\u0102\u0104lka na p\u0139\u0099edm\u00c4\u009bt <a href=\"http:\/\/unix.felk.cvut.cz\/osy\">36OSY &#8211; opera\u00c4\u008dn\u0102\u00ad syst\u0102\u0160my<\/a>. Tato semestr\u0102\u0104lka byla zam\u00c4\u009b\u0139\u0099en\u0102\u0104 na pou\u0139\u017eit\u0102\u00ad syst\u0102\u0160mov\u0102\u02ddch vol\u0102\u0104n\u0102\u00ad unixu (vlastn\u00c4\u009b to jsou funkce jako ka\u0139\u017ed\u0102\u0160 jin\u0102\u0160, jen v man str\u0102\u0104nk\u0102\u0104ch je najdete v sekci 2 a jen nejsou v\u00c4\u009bt\u0139\u0104inou tak hezky user friendly, jako jejich knihovn\u0102\u00ad nadstavby). Konkr\u0102\u0160tn\u00c4\u009b jsem jako zad\u0102\u0104n\u0102\u00ad dostal (nebo sp\u0102\u00ad\u0139\u0104 jsem si vybral z t\u00c4\u009bch co je\u0139\u0104t\u00c4\u009b zb\u0102\u02ddvaly):<\/p>\n<p>Napi\u0139\u0104te program talk, kter\u0102\u02dd umo\u0139\u017en\u0102\u00ad vz\u0102\u0104jemnou komunikaci v\u0102\u00adce u\u0139\u017eivatel\u0139\u017b v r\u0102\u0104mci jednoho po\u00c4\u008d\u0102\u00adta\u00c4\u008de. Ke komunikaci mezi procesy pou\u0139\u017eijte System V IPC sd\u0102\u00adlenou pam\u00c4\u009b\u0139\u013d.<\/p>\n<p>Povoleno bylo jak komunikovat po znac\u0102\u00adch tak po \u0139\u0099\u0102\u0104dc\u0102\u00adch (jako t\u0139\u0099eba u IRC). P\u0139\u0099i tom pro\u00c4\u008d\u0102\u00adt\u0102\u0104n\u0102\u00ad zad\u0102\u0104n\u0102\u00ad jsem si vzpomn\u00c4\u009bl, \u0139\u017ee komunikac\u0102\u00ad mezi procesy se zab\u0102\u02ddv\u0102\u0104 pom\u00c4\u009brn\u00c4\u009b podrobn\u00c4\u009b seri\u0102\u0104l o programovan\u0102\u00ad v \u00c4\u008dasopise Linux+, kter\u0102\u0160ho jsem \u0139\u0104\u0139\u013dastn\u0102\u02ddm odb\u00c4\u009bratelem. No a doma jsem skute\u00c4\u008dn\u00c4\u009b na\u0139\u0104el docela hezk\u0102\u0160 pov\u0102\u00add\u0102\u0104n\u0102\u00ad o semaforech, sd\u0102\u00adlen\u0102\u0160 pam\u00c4\u009bti a zas\u0102\u00adl\u0102\u0104n\u0102\u00ad zpr\u0102\u0104v v <a href=\"http:\/\/www.softwaremedia.cz\/index.php?menu=casopis&#038;detail=19\">Linux+ 2\/2004<\/a>. Napsal to dokonce n\u00c4\u009bjak\u0102\u02dd student felu, dnes v \u0139\u0104est\u0102\u0160m ro\u00c4\u008dn\u0102\u00adku. Asi si vzpomn\u00c4\u009bl na t\u0139\u0099e\u0139\u013d\u0102\u0104k ;o) Sou\u00c4\u008d\u0102\u0104st\u0102\u00ad \u00c4\u008dl\u0102\u0104nku byl i listing k\u0102\u0142du producent\/konzument, co\u0139\u017e je typick\u0102\u02dd p\u0139\u0099\u0102\u00adklad uv\u0102\u0104d\u00c4\u009bn\u0102\u02dd v souvislosti se sd\u0102\u00adlenou pam\u00c4\u009bt\u0102\u00ad a semafory. J\u0102\u0104 jsem si ho u s\u0102\u0160gry na po\u00c4\u008d\u0102\u00adta\u00c4\u008di naskenoval a OCR programem p\u0139\u0099evedl do textu (pravdou je, \u0139\u017ee bych to asi m\u00c4\u009bl rychleji p\u0139\u0099epsan\u0102\u0160).<\/p>\n<p>V tom p\u0139\u0099\u0102\u00adklad\u00c4\u009b jde o to, \u0139\u017ee jeden proces do sd\u0102\u00adlen\u0102\u0160 pam\u00c4\u009bti zapisuje a druh\u0102\u02dd z n\u0102\u00ad \u00c4\u008dte &#8211; \u00c4\u008dili v prvn\u0102\u00adm p\u0139\u0099ibl\u0102\u00ad\u0139\u017een\u0102\u00ad p\u0139\u0099esn\u00c4\u009b to, co jsem pot\u0139\u0099eboval. Mimochodem \u0102\u015floha producent\/konzument byla tak\u0102\u0160 jedn\u0102\u00adm ze zad\u0102\u0104n\u0102\u00ad. Z\u0102\u0104kladn\u0102\u00ad my\u0139\u0104lenka \u0139\u0099e\u0139\u0104en\u0102\u00ad je v tom, \u0139\u017ee <a href=\"http:\/\/nax.hn.org\/pub\/skola\/sem6\/osy\/sem2\/prod_konz\/prod.c\">producent<\/a> naalokuje sd\u0102\u00adlenou pam\u00c4\u009b\u0139\u013d pomoc\u0102\u00ad funkce shmget n\u00c4\u009bjak takhle:<\/p>\n<p><strong>shm_id=shmget(key,sizeof(struct shmem),IPC_CREAT|0666)<\/strong><\/p>\n<p>kde prvn\u0102\u00ad parametr je kl\u0102\u00ad\u00c4\u008d pod kter\u0102\u02ddm ten kus pam\u00c4\u009bti bude hledat i konzument (tedy nejsp\u0102\u00ad\u0139\u0104 n\u00c4\u009bjak\u0102\u0104 konstanta p\u0139\u0099i p\u0139\u0099ekladu), n\u0102\u0104sleduje velikost pam\u00c4\u009bti kter\u0102\u0104 n\u0102\u0104s zaj\u0102\u00adm\u0102\u0104 a posledn\u0102\u00ad je bitov\u0102\u0160 logick\u0102\u0160 nebo p\u0139\u0099esn\u00c4\u009bj\u0139\u0104\u0102\u00adho ur\u00c4\u008den\u0102\u00ad chov\u0102\u0104n\u0102\u00ad (IPC_CREAT znamen\u0102\u0104 pokud je\u0139\u0104t\u00c4\u009b nic takov\u0102\u0160ho naalokovan\u0102\u0160ho nen\u0102\u00ad tak vytvo\u0139\u0099) a p\u0139\u0099\u0102\u00adstupov\u0102\u02ddch pr\u0102\u0104v k takov\u0102\u0160 pam\u00c4\u009bti. Vr\u0102\u0104cenou hodnotu shm_id hned pou\u0139\u017eijeme v funkci, kterou si p\u0139\u0099ipoj\u0102\u00adme sd\u0102\u00adlenou pam\u00c4\u009b\u0139\u013d do sv\u0102\u0160ho adresov\u0102\u0160ho prostoru:<\/p>\n<p><strong>pshmem=(struct shmem *)shmat(shm_id,NULL,0))<\/strong><\/p>\n<p>A abych nezapomn\u00c4\u009bl &#8211; pot\u0139\u0099ebujete m\u0102\u00adt pro pr\u0102\u0104ci se sd\u0102\u00adlenou pam\u00c4\u009bt\u0102\u00ad v hlavi\u00c4\u008dce<\/p>\n<p><strong>#include &lt;sys\/ipc.h&gt;<\/strong><br \/>\n<strong>#include &lt;sys\/shm.h&gt;<\/strong><\/p>\n<p>nav\u0102\u00adc budeme pot\u0139\u0099ebovat pracovat se semafory (hned vysv\u00c4\u009btl\u0102\u00adm) a tak je\u0139\u0104t\u00c4\u009b p\u0139\u0099id\u0102\u0104me:<\/p>\n<p><strong>#include &lt;sys\/sem.h&gt;<\/strong><\/p>\n<p>Ono toti\u0139\u017e se sd\u0102\u00adlenou pam\u00c4\u009bt\u0102\u00ad je docela pot\u0102\u00ad\u0139\u017e v tom, \u0139\u017ee nikdy nev\u0102\u00adme kdy kter\u0102\u02dd proces se dostane k jej\u0102\u00admu z\u0102\u0104pisu a k jej\u0102\u00admu \u00c4\u008dten\u0102\u00ad. V d\u0139\u017bsledku toho by pak mohly vznikat nekonzistence (u p\u0139\u0099\u0102\u00adkladu konzument\/producent se t\u0139\u0099eba m\u0139\u017b\u0139\u017ee st\u0102\u0104t, \u0139\u017ee producent, je\u0139\u0104t\u00c4\u009b do pam\u00c4\u009bti nezapsal v\u0139\u0104echno, ale konzument byl rychlej\u0139\u0104\u0102\u00ad a p\u0139\u0099e\u00c4\u008detl z pam\u00c4\u009bti co tam zat\u0102\u00adm bylo). Dal\u0139\u0104\u0102\u00ad mo\u0139\u017en\u0102\u02dd p\u0139\u0099\u0102\u00adklad chyb vznikl\u0102\u02ddch pokud nebudeme n\u00c4\u009bjak synchronizovat \u00c4\u008dten\u0102\u00ad a z\u0102\u0104pis vznikne t\u0139\u0099eba tehdy, kdy\u0139\u017e producent je\u0139\u0104t\u00c4\u009b nic nov\u0102\u0160ho do pam\u00c4\u009bti nezapsal, ale producent v tom sv\u0102\u0160m \u00c4\u008dtec\u0102\u00adm cyklu u\u0139\u017e znovu do\u0139\u0104el k m\u0102\u00adstu s p\u0139\u0099e\u00c4\u008dten\u0102\u00adm sd\u0102\u00adlen\u0102\u0160 pam\u00c4\u009bti. Existuje v\u0102\u00adce zp\u0139\u017bsob\u0139\u017b jak chr\u0102\u0104nit tzv &#8222;kritickou sekci&#8220;, neboli m\u0102\u00adsto v k\u0102\u0142du kde se n\u00c4\u009bjak manipuluje se sd\u0102\u00adlenou pam\u00c4\u009bt\u0102\u00ad. U IPC to jsou semafory, pomoc\u0102\u00ad kter\u0102\u02ddch se d\u0102\u0104 \u0139\u0099e\u0139\u0104it v\u00c4\u009bt\u0139\u0104ina probl\u0102\u0160m\u0139\u017b. P\u0139\u0099edstava je prost\u00c4\u009b takov\u0102\u0104, \u0139\u017ee p\u0139\u0099i vstupu do kritick\u0102\u0160 sekce proces koukne na semafor a pokud tam je zelen\u0102\u0104, tak rozsv\u0102\u00adt\u0102\u00ad \u00c4\u008dervenou a vleze do vnit\u0139\u0099. Pokud sv\u0102\u00adt\u0102\u00ad \u00c4\u008derven\u0102\u0104 tak \u00c4\u008dek\u0102\u0104 na zelenou a a\u0139\u017e pak rozsv\u0102\u00adt\u0102\u00ad zase \u00c4\u008dervenou a vejde dovnit\u0139\u0099. Zelenou pak nesm\u0102\u00ad zapomenout rozsv\u0102\u00adtit, kdy\u0139\u017e kritickou sekci opou\u0139\u0104t\u0102\u00ad.<\/p>\n<p>Probl\u0102\u0160m by ale mohl vzniknout i tady a to tehdy, kdy\u0139\u017e by se k lizu dostal druh\u0102\u02dd proces mezi t\u0102\u00adm, kdy se ten n\u0102\u0104\u0139\u0104 pod\u0102\u00adval na zelenou a t\u0102\u00adm kdy se ji pokusil nastavit. Proto jsou tyhle 2 akce opera\u00c4\u008dn\u0102\u00adm syst\u0102\u0160mem neodd\u00c4\u009bliteln\u0102\u0160 (tzv atomick\u0102\u0160).<\/p>\n<p>No tak abych se vr\u0102\u0104til k tomu popisu producenta &#8211; ten si tedy zaalokuje pot\u0139\u0099ebn\u0102\u02dd po\u00c4\u008det semafor\u0139\u017b (tady budeme pot\u0139\u0099ebovat 2) co\u0139\u017e se d\u00c4\u009bl\u0102\u0104 &#8211; sv\u00c4\u009bte div se &#8211; pomoc\u0102\u00ad funkce semget, kterou vol\u0102\u0104me n\u00c4\u009bjak takhle:<\/p>\n<p><strong>sem_id=semget(key,2,IPC_CREAT|0666))<\/strong><\/p>\n<p>Tentokr\u0102\u0104t je snad u\u0139\u017e v\u0139\u0104echno jasn\u0102\u0160, ne? N\u0102\u0104sleduje inicializace hodnot semafor\u0139\u017b &#8211; to se d\u00c4\u009bl\u0102\u0104 pomoc\u0102\u00ad funkce semctl, kter\u0102\u0104 jako jeden argument dostane<\/p>\n<p><strong>union semun {<\/strong><br \/>\n<strong>    int val;<\/strong><br \/>\n<strong>    struct semid_ds *buf;<\/strong><br \/>\n<strong>    unsigned short *array;<\/strong><br \/>\n<strong>} sem_arg;<\/strong><\/p>\n<p>kde n\u0102\u0104s vlastn\u00c4\u009b zaj\u0102\u00adm\u0102\u0104 hlavn\u00c4\u009b to val, kam nahrajeme na co chceme p\u0139\u0099\u0102\u00adslu\u0139\u0104n\u0102\u00ad semafor inicializovat:<\/p>\n<p><strong>sem_arg.val=0;<\/strong><br \/>\n<strong>semctl(sem_id,0,SETVAL,sem_arg)<\/strong><\/p>\n<p><strong>sem_arg.val=1;<\/strong><br \/>\n<strong>semctl(sem_id,1,SETVAL,sem_arg)<\/strong><\/p>\n<p>T\u0102\u00adm m\u0102\u0104me p\u0139\u0099\u0102\u00adpravn\u0102\u0160 pr\u0102\u0104ce za sebou a p\u0139\u0099ed n\u0102\u0104mi je v\u0102\u02ddkonn\u0102\u02dd cykl. Ten za\u00c4\u008d\u0102\u00adn\u0102\u0104 pod\u0102\u00adv\u0102\u0104n\u0102\u00adm se na semafor, jestli na n\u00c4\u009bm sv\u0102\u00adt\u0102\u00ad zelen\u0102\u0104 a pokud ano, tak rozsv\u0102\u00adcen\u0102\u00ad \u00c4\u008derven\u0102\u0160 a pokra\u00c4\u008dov\u0102\u0104n\u0102\u00adm. To se realizuje tak, \u0139\u017ee do <strong>struct sembuf sops;<\/strong> n\u0102\u0104sleduj\u0102\u00adc\u0102\u00ad:<\/p>\n<p><strong>sops.sem_num=1; \/* kter\u0102\u02dd semafor *\/<\/strong><br \/>\n<strong>sops.sem_op=-1; \/* typ operace *\/<\/strong><br \/>\n<strong>sops.sem_flg=0; \/* dal\u0139\u0104\u0102\u00ad parametry operace *\/<\/strong><\/p>\n<p><strong>semop(sem_id,&#038;sops,1)<\/strong><\/p>\n<p>Jestli se d\u0102\u00adv\u0102\u0104me na zelenou, nebo naopak za sebou zelenou rozsv\u00c4\u009bc\u0102\u00adme se \u0139\u0099\u0102\u00add\u0102\u00ad pr\u0102\u0104v\u00c4\u009b parametrem sem_op a to takhle:<\/p>\n<p><strong>if (sem_op &lt; 0) { <\/strong>\/* podle toho jestli sv\u0102\u00adt\u0102\u00ad zelen\u0102\u0104 nebo \u00c4\u008derven\u0102\u0104 se zachovej *\/<br \/>\n<strong>      if (semval &lt; 0)          <\/strong>\/* sv\u0102\u00adt\u0102\u00ad zelen\u0102\u0104 *\/<br \/>\n<strong>              semval&#8211;;     <\/strong>\/* tak rozsvi\u0139\u013d \u00c4\u008dervenou a pokra\u00c4\u008duj *\/<br \/>\n<strong>      if (semval &gt;=0)          <\/strong>\/* sv\u0102\u00adt\u0102\u00ad \u00c4\u008derven\u0102\u0104 *\/<br \/>\n<strong>              \u00c4\u008dekej dokud nebude (semval &lt; 0);<\/strong><br \/>\n<strong>} <\/strong><br \/>\n<strong>if (sem_op &gt; 0) { <\/strong>\/* po odchodu z kritick\u0102\u0160 sekce *\/<br \/>\n<strong>      semval++;           <\/strong>\/* za sebou rozsvi\u0139\u013d zelenou *\/<br \/>\n<strong>}<\/strong><br \/>\n<strong>if (sem_op == 0) { <\/strong>\/* pou\u0139\u017e\u0102\u00adv\u0102\u0104 se jako bari\u0102\u0160ra &#8211; po\u00c4\u008dkat a\u0139\u017e sem dob\u00c4\u009bhnou v\u0139\u0104echny procesy *\/<br \/>\n<strong>  \u00c4\u008dekej dokud nebude (semval == 0);<\/strong><br \/>\n<strong>}<\/strong><\/p>\n<p>Samoz\u0139\u0099ejm\u00c4\u009b existuj\u0102\u00ad n\u00c4\u009bjak\u0102\u0160 dal\u0139\u0104\u0102\u00ad v\u00c4\u009btve tohohle rozv\u00c4\u009btven\u0102\u0160ho stromu (nap\u0139\u0099\u0102\u00adklad p\u0139\u0099\u0102\u00adchod sign\u0102\u0104lu proces probud\u0102\u00ad a m\u0139\u017b\u0139\u017ee se vykonat jeho obsluha i kdy\u0139\u017e fakticky stoj\u0102\u00ad na semaforu), ale tohle jsou ty nejz\u0102\u0104kladn\u00c4\u009bj\u0139\u0104\u0102\u00ad p\u0139\u0099\u0102\u00adpady. V\u0102\u00adce viz man semop.<\/p>\n<p>V tom cyklu producent v\u0139\u017edy nejd\u0139\u0099\u0102\u00adv koukne na semafor 1 (na za\u00c4\u008d\u0102\u0104tku je nastaven\u0102\u02dd na 1 tady pokra\u00c4\u008duje), pak zap\u0102\u00ad\u0139\u0104e do sd\u0102\u00adlen\u0102\u0160 pam\u00c4\u009bti a nakonec nastav\u0102\u00ad zelenou (tedy sem_op=1) na semaforu 0, co\u0139\u017e odblokuje <a href=\"http:\/\/nax.hn.org\/pub\/skola\/sem6\/osy\/sem2\/prod_konz\/konz.c\">konzumenta<\/a>, kter\u0102\u02dd to p\u0139\u0099e\u00c4\u008dte a a\u0139\u017e to p\u0139\u0099e\u00c4\u008dte, tak nastav\u0102\u00ad zelenou na semaforu 1, na kter\u0102\u0160m do t\u0102\u0160 doby \u00c4\u008dek\u0102\u0104 producent.<\/p>\n<p>Docela jednoduch\u0102\u0160, co \u0139\u0099\u0102\u00adk\u0102\u0104te ;o) No ale po\u0139\u0099\u0102\u0104d je to daleko lep\u0139\u0104\u0102\u00ad ne\u0139\u017e se patlat s n\u00c4\u009bjak\u0102\u02ddm aktivn\u0102\u00adm \u00c4\u008dek\u0102\u0104n\u0102\u00adm, kter\u0102\u0160 by ale stejn\u00c4\u009b n\u00c4\u009bkdy n\u0102\u0104hodn\u00c4\u009b nefungovalo. Tohle je zkute\u00c4\u008dn\u00c4\u009b bezpe\u00c4\u008dn\u0102\u0104 cesta, jak programov\u00c4\u009b o\u0139\u0104et\u0139\u0099it tu nekonzistenci dat ve sd\u0102\u00adlen\u0102\u0160 pam\u00c4\u009bti.<\/p>\n<p>V tom \u00c4\u008dasopise byl je\u0139\u0104t\u00c4\u009b nav\u0102\u00adc zdroj\u0102\u0104\u00c4\u008dek pro <a href=\"http:\/\/nax.hn.org\/pub\/skola\/sem6\/osy\/sem2\/prod_konz\/turnoff.c\">uvoln\u00c4\u009bn\u0102\u00ad sd\u0102\u00adlen\u0102\u0160 pam\u00c4\u009bti<\/a>. Na to nezapom\u0102\u00adnejte, proto\u0139\u017ee pak v\u0102\u0104m jednak nemus\u0102\u00ad sed\u00c4\u009bt hodnoty semafor\u0139\u017b a jednak velikost mo\u0139\u017en\u0102\u0160 sd\u0102\u00adlen\u0102\u0160 pam\u00c4\u009bti je p\u0139\u0099eci jen omezen\u0102\u0104 a m\u00c4\u009b se skute\u00c4\u008dn\u00c4\u009b na t\u00c4\u009bch sunech ve \u0139\u0104kole stalo, \u0139\u017ee ta pam\u00c4\u009b\u0139\u013d (ne tedy moj\u0102\u00ad vinou) do\u0139\u0104la. Jinak k vyps\u0102\u0104n\u0102\u00ad sd\u0102\u00adlen\u0102\u02ddch prost\u0139\u0099edk\u0139\u017b slou\u0139\u017e\u0102\u00ad p\u0139\u0099\u0102\u00adkaz <strong>ipcs<\/strong> a pro uvoln\u00c4\u009bn\u0102\u00ad pak <strong>ipcrm {shm | msg | sem} id<\/strong>.<\/p>\n<p>No a te\u00c4\u008f k t\u0102\u0160 moj\u0102\u00ad semestr\u0102\u0104lce. Opravdu mne nenapadlo, jak to ud\u00c4\u009blat jinak abych z\u0102\u0104rove\u0139\u0088 mohl \u00c4\u008dekat na vlo\u0139\u017een\u0102\u00ad n\u00c4\u009b\u00c4\u008deho t\u0139\u0099eba funkc\u0102\u00ad gets() a p\u0139\u0099itom moci vypsat zpr\u0102\u0104vu, kter\u0102\u0104 p\u0139\u0099i\u0139\u0104la od jin\u0102\u0160ho u\u0139\u017eivatele, ne\u0139\u017e tak, \u0139\u017ee jsem sv\u0139\u017bj proces po inicializac\u0102\u00adch rozd\u00c4\u009blil na 2, z nich\u0139\u017e p\u0139\u0099edek p\u0139\u0099edstavoval producenta a potomek pak konzumenta. V unixu se rozd\u00c4\u009blen\u0102\u00ad proces\u0139\u017b realizuje pomoc\u0102\u00ad fork, konkr\u0102\u0160tn\u00c4\u009bji t\u0102\u0160to konstrukce:<\/p>\n<p><strong>x = fork();<\/strong> \/* tady se proces rozdvoj\u0102\u00ad *\/<br \/>\n<strong>if (x == 0) {<\/strong><br \/>\n    \/* tady bude t\u00c4\u009blo potomka *\/<br \/>\n<strong>} else {<\/strong> \/* proto\u0139\u017ee p\u0139\u0099edek v x m\u0102\u0104 te\u00c4\u008f PID potomka *\/<br \/>\n    \/* tak tady bude t\u00c4\u009blo p\u0139\u0099edka *\/<br \/>\n<strong>}<\/strong><\/p>\n<p>Pak ale nastane probl\u0102\u0160m s t\u0102\u00adm, aby jednak na jeden z\u0102\u0104pis producenta p\u0139\u0099ipadlo prob\u00c4\u009bhnut\u0102\u00ad v\u0139\u0104ech spu\u0139\u0104t\u00c4\u009bn\u0102\u02ddch konzument\u0139\u017b a p\u0139\u0099itom ka\u0139\u017ed\u0102\u02dd to ale mus\u0102\u00ad p\u0139\u0099e\u00c4\u008d\u0102\u00adst jen jednou. Nejprve tedy mus\u0102\u00adm v\u00c4\u009bd\u00c4\u009bt kolikr\u0102\u0104t je m\u0139\u017bj program spu\u0139\u0104t\u00c4\u009bn &#8211; m\u0102\u00adt counter v sd\u0102\u00adlen\u0102\u0160 pam\u00c4\u009bti se p\u0139\u0099\u0102\u00admo nab\u0102\u00adz\u0102\u00ad. Nav\u0102\u00adc se mi ten counter hod\u0102\u00ad na to, abych p\u0139\u0099i ukon\u00c4\u008dov\u0102\u0104n\u0102\u00ad v\u00c4\u009bd\u00c4\u009bl, jestli nejsem n\u0102\u0104hodou posledn\u0102\u00ad a tedy mohu bez obav vr\u0102\u0104tit sd\u0102\u00adlenou pam\u00c4\u009b\u0139\u013d a semafory. No a pak prost\u00c4\u009b po\u00c4\u008det instanc\u0102\u00ad nastav\u0102\u00adm truct do p\u0139\u0099\u0102\u00adslu\u0139\u0104n\u0102\u0160ho semaforu. To mi ale ne\u0139\u0099e\u0139\u0104\u0102\u00ad probl\u0102\u0160m s t\u0102\u00adm, \u0139\u017ee jeden konzument bude tak rychl\u0102\u02dd, \u0139\u017ee vyp\u0102\u00ad\u0139\u0104e tu zpr\u0102\u0104vu ve sd\u0102\u00adlen\u0102\u0160 pam\u00c4\u009bti n\u00c4\u009bkolikr\u0102\u0104t a t\u0102\u00adm p\u0102\u0104dem se na n\u00c4\u009bkter\u0102\u0160 nedostane. K tomu jsem pr\u0102\u0104v\u00c4\u009b vyu\u0139\u017eil tu bari\u0102\u0160ru. V\u0139\u0104echny procesy, kter\u0102\u0160 u\u0139\u017e vypsali aktu\u0102\u0104ln\u0102\u00ad zpr\u0102\u0104vu \u00c4\u008dekaj\u0102\u00ad na konci cyklu do t\u0102\u0160 doby, ne\u0139\u017e tam doraz\u0102\u00ad v\u0139\u0104ichni producenti. Konkr\u0102\u0160tn\u00c4\u009b nastav\u0102\u00adm v producentovi do semaforu 3 po\u00c4\u008det instanc\u0102\u00ad a pak p\u0139\u0099i ka\u0139\u017ed\u0102\u0160m pr\u0139\u017bchodu \u00c4\u008dten\u0102\u00adm v producentovi ode\u00c4\u008dtu jedni\u00c4\u008dku (ale po\u0139\u0099\u0102\u0104d semval z\u0139\u017bst\u0102\u0104v\u0102\u0104 kladn\u0102\u0104 tak\u0139\u017ee pokra\u00c4\u008duje) a hned za t\u0102\u00adm n\u0102\u0104sleduje vol\u0102\u0104n\u0102\u00ad semop s parametrem 0, tedy \u00c4\u008dekej dokud nebude 0.<\/p>\n<p>Na tohle ne\u0139\u017e jsem p\u0139\u0099i\u0139\u0104el tak jsem si zp\u0139\u017bsobil po\u0139\u0099\u0102\u0104dn\u0102\u0160 bolen\u0102\u00ad hlavy. V\u0102\u02ddsledn\u0102\u02dd program, kter\u0102\u02dd jsem nazval <a href=\"http:\/\/nax.hn.org\/pub\/skola\/sem6\/osy\/sem2\/stalk\/\">stalk<\/a> nav\u0102\u00adc je\u0139\u0104t\u00c4\u009b obsahuje jednoduchou\u00c4\u008dk\u0102\u0160 curses u\u0139\u017eivatelsk\u0102\u0160 rozhran\u0102\u00ad, kter\u0102\u0160 mne ov\u0139\u0104em nakonec nejsp\u0102\u00ad\u0139\u0104 st\u0102\u0104lo bod. Vych\u0102\u0104zel jsem z toho, \u0139\u017ee nev\u0102\u00adm o jin\u0102\u0160m zp\u0139\u017bsobu jak o\u0139\u0104et\u0139\u0099it situaci kdy do rozepsan\u0102\u0160 zpr\u0102\u0104vy p\u0139\u0099ijde zpr\u0102\u0104va n\u00c4\u009bkoho jin\u0102\u0160ho. Logicky z toho vypl\u0102\u02ddv\u0102\u0104, \u0139\u017ee pot\u0139\u0099ebuju jednu \u00c4\u008d\u0102\u0104st termin\u0102\u0104lu aby slou\u0139\u017eila jako vkl\u0102\u0104dac\u0102\u00ad pro producenta a druhou \u00c4\u008d\u0102\u0104st jako vypisovac\u0102\u00ad pro konzumenta.<\/p>\n<p>Velice dobr\u0102\u02dd tutori\u0102\u0104l (teda on popisuje ncurses, ale to je n\u0102\u0104sledn\u0102\u00adk curses a p\u0139\u0099i sv\u0102\u02ddch za\u00c4\u008d\u0102\u0104te\u00c4\u008dnick\u0102\u02ddch pokusech jsem vyjma makra box() nenarazil na nic co by neum\u00c4\u009blo i samostatn\u0102\u0160 curses) je <a href=\"http:\/\/en.tldp.org\/HOWTO\/NCURSES-Programming-HOWTO\/\">NCURSES Programming HOWTO<\/a>. Probl\u0102\u0160m s curses (btw anglicky to znamen\u0102\u0104 &#8222;kletby&#8220; a mus\u0102\u00adm \u0139\u0099\u0102\u00adct \u0139\u017ee u\u0139\u017e v\u0102\u00adm pro\u00c4\u008d) byl hlavn\u00c4\u009b v tom, \u0139\u017ee nen\u0102\u00ad stav\u00c4\u009bn\u0102\u0160 na to, aby ho z\u0102\u0104rove\u0139\u0088 pou\u0139\u017e\u0102\u00advaly 2 procesy. Ur\u00c4\u008dit\u0102\u02ddm \u0139\u0099e\u0139\u0104en\u0102\u00adm by byly thready (na venek se aplikace chov\u0102\u0104 jako jeden proces a v\u0139\u0104echny podprocesy maj\u0102\u00ad sd\u0102\u00adlenou celou svoj\u0102\u00ad pam\u00c4\u009b\u0139\u013d) ale ty jsem pou\u0139\u017e\u0102\u00adt nemohl proto\u0139\u017ee jsem mezi vol\u0102\u0104n\u0102\u00adm j\u0102\u0104dra nena\u0139\u0104el jak je jednodu\u0139\u0104e vytvo\u0139\u0099it. Jedin\u0102\u0160 jednoduch\u0102\u0160 \u0139\u0099e\u0139\u0104en\u0102\u00ad pomoc\u0102\u00ad syscall\u0139\u017b mne napadlo pou\u0139\u017eit\u0102\u00ad sign\u0102\u0104l\u0139\u017b.<\/p>\n<p>To je mechanizmus asynchronn\u0102\u00ad kontroly proces\u0139\u017b. Vlastn\u00c4\u009b n\u00c4\u009bco jako INT v hardwaru, nebo softwarov\u0102\u02dd INT v assembleru. T\u0139\u0099eba pokud pou\u0139\u017e\u0102\u00adv\u0102\u0104te n\u00c4\u009bjakou aplikaci a stisknete CTRL+C tak aplikace dostane SIGINT a v\u00c4\u009bt\u0139\u0104inou obsluha tohoto sign\u0102\u0104lu ukon\u00c4\u008d\u0102\u00ad b\u00c4\u009b\u0139\u017e\u0102\u00adc\u0102\u00ad aplikaci. Ale obsluha v\u00c4\u009bt\u0139\u0104iny sign\u0102\u0104l\u0139\u017b se d\u0102\u0104 p\u0139\u0099edefinovat a dokonce ve standardu jsou 2 sign\u0102\u0104ly SIGUSR1 a SIGUSR2 kter\u0102\u0160 jsou p\u0139\u0099\u0102\u00admo ur\u00c4\u008deny k u\u0139\u017eivatelsk\u0102\u0160mu p\u0139\u0099edefinov\u0102\u0104n\u0102\u00ad jejich obsluh.<\/p>\n<p>Na v\u00c4\u009bci okolo sign\u0102\u0104l\u0139\u017b jsem se ptal na cvi\u00c4\u008den\u0102\u00ad z p\u0139\u0099edm\u00c4\u009btu <a href=\"http:\/\/unix.felk.cvut.cz\/unix\/\">unix<\/a> (p\u0139\u0099edn\u0102\u0104\u0139\u0104ku kde se braly sign\u0102\u0104ly najdete <a href=\"http:\/\/unix.felk.cvut.cz\/unix\/download\/predn_06.pdf\">tady<\/a>) a ten cvi\u00c4\u008d\u0102\u00adc\u0102\u00ad mi doporu\u00c4\u008dil a\u0139\u013d si st\u0102\u0104hnu knihu <a href=\"http:\/\/www.advancedlinuxprogramming.com\/\">Advanced Linux Programming<\/a>. Mimochodem vy\u0139\u0104la i v \u00c4\u008de\u0139\u0104tin\u00c4\u009b, ale ta se u\u0139\u017e pokud v\u0102\u00adm st\u0102\u0104hnout z webu ned\u0102\u0104 \ud83d\ude41<\/p>\n<p>Aby se p\u0139\u0099i p\u0139\u0099ijet\u0102\u00ad sign\u0102\u0104lu pustila va\u0139\u0104e obsluha zajist\u0102\u00adte takhle:<\/p>\n<p><strong>signal(SIGUSR1,printkonz);<\/strong><\/p>\n<p>kde ten druh\u0102\u02dd argument je jm\u0102\u0160no funkce s takov\u0102\u02ddmhle prototypem:<\/p>\n<p><strong>void printkonz(int cislo_signalu)<\/strong><\/p>\n<p>To \u00c4\u008d\u0102\u00adslo sign\u0102\u0104lu se sakra hod\u0102\u00ad v p\u0139\u0099\u0102\u00adpad\u00c4\u009b, \u0139\u017ee pou\u0139\u017e\u0102\u00adv\u0102\u0104te stejnou obsluhu pro v\u0102\u00adce p\u0139\u0099eru\u0139\u0104en\u0102\u00ad (nicm\u0102\u0160n\u00c4\u009b i kdy\u0139\u017e nepou\u0139\u017e\u0102\u00adv\u0102\u0104te, tak tam b\u0102\u02ddt mus\u0102\u00ad aby funkce signal poznala \u0139\u017ee je to ta obsluha). Ono toti\u0139\u017e po prvn\u0102\u00adm p\u0139\u0099\u0102\u00adchodu sign\u0102\u0104lu se ta va\u0139\u0104e obsluha zase odhl\u0102\u0104s\u0102\u00ad a mus\u0102\u00adte j\u0102\u00ad znovu p\u0139\u0099ihl\u0102\u0104sit pokud chcete aby se p\u0139\u0099i p\u0139\u0099\u0102\u00ad\u0139\u0104t\u0102\u00adm p\u0139\u0099ijet\u0102\u00ad sign\u0102\u0104lu znovu pustila tahle obsluha.<\/p>\n<p>No a to je vlastn\u00c4\u009b v\u0139\u0104echno co jsem si cht\u00c4\u009bl zaznamenat. Snad se v tom vyzn\u0102\u0104m, a\u0139\u017e to n\u00c4\u009bkdy budu zase pot\u0139\u0099ebovat a snad se to bude hodit n\u00c4\u009bkdy i n\u00c4\u009bkomu jin\u0102\u0160mu.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>No tedy j\u0102\u0104 tenhle blog vedu. Teda sp\u0102\u00ad\u0139\u0104 ve \u0139\u0104kole je to docela n\u0102\u0104ro\u00c4\u008dn\u0102\u0160. Nebo sp\u0102\u00ad\u0139\u0104 si to ve \u0139\u0104kole trochu n\u0102\u0104ro\u00c4\u008dn\u0102\u0160 d\u00c4\u009bl\u0102\u0104m. V uplynul\u0102\u0160m t\u0102\u02dddnu mne pln\u00c4\u009b vyt\u00c4\u009b\u0139\u017eovala semestr\u0102\u0104lka na p\u0139\u0099edm\u00c4\u009bt 36OSY &#8211; opera\u00c4\u008dn\u0102\u00ad syst\u0102\u0160my. Tato semestr\u0102\u0104lka byla zam\u00c4\u009b\u0139\u0099en\u0102\u0104 na pou\u0139\u017eit\u0102\u00ad syst\u0102\u0160mov\u0102\u02ddch vol\u0102\u0104n\u0102\u00ad unixu (vlastn\u00c4\u009b to jsou funkce jako ka\u0139\u017ed\u0102\u0160 jin\u0102\u0160, jen v man [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-96","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/nax.cz\/index.php?rest_route=\/wp\/v2\/posts\/96","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nax.cz\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nax.cz\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nax.cz\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nax.cz\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=96"}],"version-history":[{"count":0,"href":"https:\/\/nax.cz\/index.php?rest_route=\/wp\/v2\/posts\/96\/revisions"}],"wp:attachment":[{"href":"https:\/\/nax.cz\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=96"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nax.cz\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=96"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nax.cz\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=96"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}