Capitolul 26
Interacțiunea procesului în Linux
26.1. Metode de interacțiune
Procesele, ca și oamenii, pot "comunica" între ele, adică schimbul de informații. În Capitolul 3 am examinat pe scurt două mijloace de comunicare interproces (IPC, comunicare inter-proces); canale semi-duplex (conducte) și semnale, dar pe sistemele UNIX astfel de fonduri sunt mult mai mari. În acest capitol, voi lista restul instrumentelor IPC și le voi arăta cum să le folosiți în cod.
Din cele mai vechi timpuri, se numesc canale FIFO (First In-First Out) și prize de rețea (prize). Împreună cu conductele și semnalele, ele constituie un IPC de tip BSD. ATT împreună cu sistemul de operare System V au oferit trei tipuri noi de IPC:
În sistemul de operare Linux, sunt suportate ambele tipuri de IPC - System V și BSD, adică în Linux putem folosi toate metodele IPC de mai sus.
26,2. Canale semi-duplex
Permiteți-mi să vă reamintesc că un canal este o modalitate de a conecta ieșirea standard a unui proces la intrarea standard a altui proces. Canalele sunt cronometre UNIX: au apărut în primele versiuni ale UNIX. Canalele half-duplex vă permit să faceți schimb de informații într-o singură direcție. Dacă procesul strămoșului transmite informații de la ieșirea standard la intrarea standard a copilului, acesta este un exemplu de canal semi-duplex.
Ce este redirecționarea intrare / ieșire și modul de utilizare a acesteia din linia de comandă, deja știți (secțiunea 3.4.6). Acum voi arăta cum să implementați redirecționarea software-ului, adică fără intervenția utilizatorului.
FILE * popen (const const * comanda, const char * mod acces_);
Apelul popen () returnează un pointer FILE * sau un indicator NULL null dacă apelul nu a reușit. La fel ca atunci când lucrați cu fișiere obișnuite, după terminarea operației I / O, trebuie să închideți canalul apelând pclose (). Când lucrați cu un fir, vă recomand să utilizați apelul fflush (). Pentru a preveni întârzierile datorate tamponării.
Acum câteva exemple simple. Să presupunem că trebuie să trimitem la ieșirea standard numele tuturor fișierelor text conținute în directorul curent. Acest lucru se poate face foarte simplu apelând sistemul ():
Aceasta este o sarcină destul de trivială - ieșim doar datele, dar nu o procesăm. Cum să obțineți toate numele fișierelor text și să le procesați în program?
FIȘIER * fp = popen ("ls * .txt", "r");
// în buclă citiți numele tuturor fișierelor text