Rúry
Tvorba,
deskriptory, príklady, ...
Rúry sú komunikačné kanály vytvárané jadrom, ku ktorým sa pristupuje dvoma
deskriptormi : jeden pre zápis a jeden pre čítanie. Rúry sú jednosmerné a
môžu pomocou nich komunikovať len procesy, ktoré majú spoločného predka.
//---
Vytvoriť rúru môžeme na
základe príkazu pipe :
#include <unistd.h>
…
int
pipe ( int filedes[2] )
…
//---
Návratová hodnota:
“ 0 “ – rúra je vytvorená
“ –1 “ – chyba
//---
Deskriptory :
filedes[0] – pre čítanie
filedes[1] – pre zápis
//---
Ak čítame z rúry, ktorej vstup
bol uzavretý – read vráti “ 0 “.
Ak zapisujeme do rúry, ktorú nikto nečíta, unix generuje SIGPIPE.
//---
Príklad rúry pre jeden
proces :
Program definovaný reťazec najprv do rúry zapíše a potom ho naspäť načíta.
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
main( )
{
int fd[2];
static char ret[]=”KPI FEI TU”;
char buf[20];
if( pipe ( fd ) == -1) // vytvorenie
rúry
exit(1); // aj s ošetrenim pre vznik chyby
write( fd[1], ret, strlen(ret) ); // zápis do
rúry
read( fd[0], buf, strlen(ret) ); // čítanie z
rúry
}
//---
Obr. 1 Rúra v rámci jedného procesu
//---
Príklad rúry pre dva
procesy :
Program vytvorí rúru, potom pomocou príkazu fork vytvorí potomka, aby mu
rodič rúrou poslal reťazec “ hello world\n “ a potomok ho poslal na
štandardný výstup.
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int
main(void)
{
int n, fd[2];
pid_t pid;
char line[MAXLINE];
pipe(fd); // vytvorenie rúry
pid = fork(); // vytvorenie
potomka
else if (pid > 0)
{ // programová vetva rodiča
close(fd[0]); // uzavretie deskriptora
pre čítanie
write(fd[1], "hello world\n", 12); // zápis
reťazca do rúry
}
else
{
// programová vetva dieťaťa
close(fd[1]); // uzavretie deskriptora pre
zápis
n = read(fd[0], line, MAXLINE); // čítanie z
rúry
write(STDOUT_FILENO, line, n); // zápis na
štandardný výstup
}
exit(0);
}
//---
Obr. 2 Situácia po použití
volania fork
//---
Obr. 3 Rúra od rodiča k
potomkovi
//---
Príklad obojsmernej
komunikácie procesov pomocou rúr :
Proces vytvorí dve rúry a potomka. Rodič načíta zo štandardného vstupu
názov súboru, ktorý pošle potomkovi. Ten súbor otvorí a
rodičovskému procesu pošle správu o otvorení súboru. Rodič pošle správu na
štandartný výstup.
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main(void)
{
char
*buff[1024];
int pipe1[2],pipe2[2],childpid,n;
pipe(pipe1); //vytvorenie 1. rúry
pipe(pipe2); //vytvorenie 2. rúry
if
((childpid=fork())>0)
{ //predok
close(pipe1[0]);
close(pipe2[1]);
printf(" Zadajte meno suboru: ");
scanf("%s",buff);
write(pipe1[1],buff,strlen(buff)); //poslanie
údajov potomkovi
wait(); //čakanie na koniec práce potomka
read(pipe2[0],buff,30); //načítanie správy od
potomka
printf("%s",buff);
}
else
{ //potomok
close(pipe2[0]);
close(pipe1[1]);
read(pipe1[0],buff,1024); //načítanie názvu
súboru
if ((n=open(buff,O_RDONLY))>0) //
otvorenie súboru
write(pipe2[1],"Subor bol uspesne otvoreny\n",30);
//poslanie sprav
else write (pipe2[1],"Subor nebol uspesne
otvoreny\n",30); // -||-
}
}
//---
Príklad používania rúr príkazmi operačného systému ( zložené príkazy,
resp. kolóny ):
who | sort | lpr
Who je program, ktorý vypíše mená, názvy terminálov a časy
prihlásení všetkých užívateľov v systéme. Program sort
zoradí tento zoznam podľa mena a lpr je program, ktorý
odosiela výsledky tlačiarni.
//
Rúry koniec
Nahor
|