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

 

 

 

 

Index

Úvod

Rúry

Ako vytvoriť rúru

Návratová hodnota

Deskriptory

Príklad 1)

Príklad 2)

Príklad 3)

Signály

Základné vlastnosti

Spracovanie signálu

Poslanie signálu

Pozastavenie procesu

Jednoduchý príklad

Podmienky generovania

Čo ďalej so signálom

Spoľahlivé signály

Prehľad signálov

Tabuľka signálov

Iné

Infomácie

 

 

Ján Perháč

Peter Špireng