next up previous
Next: Comportamentul unui FIFO la Up: Conceptul de pipe (canal Previous: Pipe-uri fara nume

Pipe-uri cu nume

Pipe-urile cu nume (FIFO) au o intrare in structura de directoare. Acest lucru inseamna ca sa inlatura neajunsul pipe-urilor fara nume: utilizarea lor numai in contextul unui grup de procese. Daca un proces are acces la un anumit pipe atunci el poate comunica cu alte procese care au acces la acesta.

Crearea unui pipe cu nume poate fi facuta in cadrul interpretorului de comenzi sau in cadrul unui program.

Comenzile shell pentru crearea unui FIFO sunt mknod si mkfifo. Acestea pot fi utilizate in felul urmator:

razvan@ragnarok:~/cfiles/solab/labs/lab3/test$ mknod myfifo1 p
razvan@ragnarok:~/cfiles/solab/labs/lab3/test$ ls -l
total 0
prw-r--r--  1 razvan razvan 0 Oct 18 21:39 myfifo1
razvan@ragnarok:~/cfiles/solab/labs/lab3/test$ mkfifo myfifo2
razvan@ragnarok:~/cfiles/solab/labs/lab3/test$ ls -l
total 0
prw-r--r--  1 razvan razvan 0 Oct 18 21:39 myfifo1
prw-r--r--  1 razvan razvan 0 Oct 18 21:39 myfifo2

In Unix/Linux totul este un fisier. FIFO-urile sunt un caz special de fisier si pot fi identificate intr-o listare lunga (ls -l) prin prezenta literei p ca prim caracter (inaintea prezentarii drepturilor).

Apelurile folosite pentru crearea unui FIFO din cadrul unui program au acelasi nume: mknod si mkfifo. Sintaxa de apel este:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>

int mknod (const char *pathname, mode_t mode, dev_t dev);
int mkfifo (const char *pathname, mode_t mode);

int mknod (const char *pathname, mode_t mode | S_IFIFO, 0);

A doua forma de apel pentru mknod este forma generica pentru crearea unui FIFO. In general, se prefera folosirea comenzii mkfifo (este specifica si mai simpla).

Putem folosi pipe-urile cu nume in cadrul unui interpretor de comenzi. Intr-o parte deschidem FIFO-ul pentru citire, si apoi scriem la celalalt capat informatia in cadrul acestuia. Un exemplu de utilizare e prezentat mai jos:

azvan@ragnarok:~/cfiles/solab/labs/lab3/test$ cat < myfifo1 &
[3] 4378
razvan@ragnarok:~/cfiles/solab/labs/lab3/test$ echo "hello world!" > myfifo1
bash: !": event not found
razvan@ragnarok:~/cfiles/solab/labs/lab3/test$ echo "hello world" > myfifo1
razvan@ragnarok:~/cfiles/solab/labs/lab3/test$ hello world

[3]+  Done                    cat <myfifo1
razvan@ragnarok:~/cfiles/solab/labs/lab3$

Putem desigur sa inversam ordinea aplicarii citirii si scrierii:

razvan@ragnarok:~/cfiles/solab/labs/lab3$ echo "hello world" > myfifo1
razvan@ragnarok:~/cfiles/solab/labs/lab3$ cat < myfifo1
hello world
razvan@ragnarok:~/cfiles/solab/labs/lab3$



Subsections
next up previous
Next: Comportamentul unui FIFO la Up: Conceptul de pipe (canal Previous: Pipe-uri fara nume
Razvan Adrian Deaconescu 2005-10-19