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.



Paweł Niewiadomski
2000-10-17