Interacțiunea dintre procese

Semnale poate notifica eroarea de a sincroniza procesele pentru transmiterea comenzilor elementare de la un proces la altul, de exemplu, pentru serveraDNSnamed (1M) este astfel utilizat signalSIGHUP fiind semnal de actualizare a bazei de date dannyh.Signaly este foarte mari consumatoare de resurse. Trimiterea unui semnal necesită un apel sistem, iar mijlocul de livrare întrerupe procesul de recepție și operațiile cu stivă (lucrul cu subrutina). Semnalele sunt puțin informative și numărul lor este limitat.







Canale. Pe un exemplu de comandă pe linia de comandă, vă rugăm să aruncați o privire la sintaxa de organizare a canalelor de programe:

Ieșirea standard a pisicii (1), care afișează conținutul fișierului de fișiere, este trecută la intrarea standard a programului wc (1), care numără numărul de linii, cuvinte și simboluri. Rezultatul este:

numărul de linii, cuvinte, caractere din fișierul meu

Astfel, cele două procese au schimbat date. Un canal software a fost utilizat pentru a asigura transferul de date unidirecțional între două sarcini.

Pentru a crea o țeavă, utilizați apelul de sistem al țevii (2):

int pipe (int * iv), altfel int pipe (int filedes [2]);

care returnează două descriptori de fișiere - fildes [0] pentru scrierea pe canal și fildes [1] pentru a citi de la canal (în cazul în care eșuează, apelul țevii returnează -1). Acum, un proces scrie date către fildes [0], celălalt poate obține aceste date din fișiere [1]. Cum obține un fișier descriptor de fișier [1] un alt proces? Când creați un proces cu atribute atribute, procesul copil moștenește și împărtășește toți descriptorii de fișiere al procesului părinte. Accesul la descriptorii filedeschannel poate obține procesul în sine, care a cauzatpipe (2), și procesele copilului său. Un dezavantaj serios al canalelor este că ele pot fi utilizate pentru a transfera date numai între procesele conexe și nu pot fi utilizate pentru a transfera date între procese independente. În exemplul de mai sus, atât procesul cat (1) și wc (1) sunt generate de iad și, prin urmare, sunt legate.







Dezavantajul canalelor este că acestea pot fi utilizate numai pentru procese conexe și nu pot fi utilizate pentru serverele seriale reale (servere de administrare a rețelei și spoolere de tipărire) și nu pot exista definitiv.

Numele canalelor FIFO (FirstInFirstOut, 1-m-entered, 1-m-out). FIFO sunt mijloace unidirecționale de transmitere a datelor, iar citirea datelor are loc în ordinea în care sunt înregistrate. FIFO au nume care vă permit să comunice procese independente (numite tevi) tip de fișier .VBSDne ispolzuyutsya.FIFOyavlyaetsya (ls-lpokazhet în primul pozitsiip). Pentru a crea FIFO, apelul de sistem mknod (2) este utilizat:

unde numele de cale este numele fișierului din FS (numele FIFO),

moduri de proprietate ale drepturilor de acces, etc. (fieldmode) De exemplu, 0666 - pentru toate drepturile de acces la scriere și citire.

dev este ignorată atunci când fișierul este creat.

FIFO poate fi creat din linia de comandă:

Odată creat, FIFO poate fi deschis pentru scriere și citire, iar scrierea și citirea pot apărea într-o varietate de procese independente.

Canalele FIFO și canalele normale funcționează în conformitate cu următoarele reguli:

Când citiți un număr mai mic de octeți decât în ​​canal sau FIFO, numărul de octeți necesar este returnat, restul este stocat pentru citirile ulterioare.

Dacă canalul este gol și nici un proces nu la deschis pentru scriere, atunci când citiți, vor fi primite 0 octeți din canal. Dacă canalul a fost deschis pentru înregistrare, dar nu a fost scris, atunci apelul de citire (2) va fi blocat până când datele vor apărea dacă blocarea O_NDELAY nu este setată pe canal.

Înregistrarea numărului de octeți, capacitatea mai mică a canalului sau FIFO este garantată atomic. Aceasta înseamnă că, în cazul în care se scrie în canal în același timp prin mai multe procese, porțiunile de date nu sunt amestecate.

Când se scrie mai mulți octeți decât canalul sau FIFO, apelul de scriere (2) este blocat până când spațiul este eliberat. Atomicitatea nu este garantată. Atunci când încearcă un proces pentru a scrie date în canal nu este deschis nici un proces pentru a citi, procesul este garantat de semnal SIGPIPE și apel de scriere (2) returnează 0 la erorile de instalare (errno = EPIPE), în cazul în care procesul nu este setat semnalul produs de procesare implicită de procesare SIGPIPE - procesul este finalizat.







Articole similare

Trimiteți-le prietenilor: