next up previous contents
Next: Operowanie FIFO Up: Nazwane potoki ( FIFO Previous: Podstawy   Contents

Tworzenie FIFO

Istnieje kilka sposobów aby utworzyć nazwany potok. Dwie pierwsze mogą zostać wykonane bezpośrednio z powłoki.

           mknod MOJEFIFO p
           mkfifo a=rw MOJEFIFO
   

Powyższe dwie komendy wykonują to samo zadanie, z jednym wyjątkiem. Komenda mkfifo umożliwia zmianę atrybutów utworzonego FIFO. Natomiast po użyciu mknod będziemy musieli w tym celu uruchomić chmod.

FIFO może być szybko zidentyfikowane poprzez literkę 'p' w listingu:

           $ ls -l MYFIFO
           prw-r--r--   1 root     root            0 Dec 14 22:15 MYFIFO|
   

Zauważ również znak potoku przy nazwie.

Aby utworzyć FIFO za pomocą C musimy posłużyć się wywołaniem systemowym mknod():


     FUNKCJA Z BIBLIOTEKI: mknod();                                                    
   
     PROTOTYP: int mknod( char *ścieżka, mode_t tryb, dev_t dev);                
       ZWRACA: 0 - sukces,                                                      
                -1 - błąd: errno = EFAULT ( nieprawidłowa ścieżka )                     
                                     EACCES ( niedozwolona operacja )                    
                                     ENAMETOOLONG ( ścieżka za długa )              
                                     ENOENT ( nieprawidłowa ścieżka )                     
                                     ENOTDIR ( nieprawidłowa ścieżka )                    
                                     ( zerknij do podręcznika mknod po więcej )           
   
     UWAGI: Tworzy węzeł w systemie plików ( plik, plik urządzenia, FIFO )
   

Szczegółowe omówienie mknod() pozostawię podręcznikowi, natomiast my zajmiemy się prostym przykładem tworzenia FIFO w C:

                   mknod("/tmp/MOJEFIFO", S_IFIFO|0666, 0);
   

W tym wypadku zostanie utworzony jako FIFO plik '/tmp/MOJEFIFO'. Żądanymi prawami dostępu są '0666', jednakże zależą one również od ustawienia umask w następujący sposób:

                   końcowe_prawa = żądane_prawa & ~oryginalny_umask
   

Trikiem na obejście tego jest użycie umask() w celu tymczasowego ustawienia wartości umask:

                   umask(0);
                   mknod("/tmp/MOJEFIFO", S_IFIFO|0666, 0);
   

Trzeci argument mknod() jest ignorowany, chyba że tworzymy plik urządzenia. W takim wypadku służy on do ustawienia głównego i podrzędnego numeru pliku urządzenia.




2000-03-01


Poltronic