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$