Provided by: manpages-pl-dev_20060617-1_all bug

NAZWA

       open, creat - otwarcie i utworzenie pliku lub urządzenia

SKŁADNIA

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

       int open(const char *pathname, int flags);
       int open(const char *pathname, int flags, mode_t mode);
       int creat(const char *pathname, mode_t mode);

OPIS

       Funkcja  systemowa  open służy do przekształcenia ścieżki na deskryptor
       pliku  (małą,  nieujemną  liczbę  całkowitą  używaną   w   późniejszych
       operacjach  we/wy,  takich jak read, write, itd.).  Jeśli wywołanie się
       powiedzie, to zwrócony deskryptor pliku będzie  najmniejszym  aktualnie
       nie  otwartym  deskryptorem  pliku dla tego procesu.  Funkcja ta tworzy
       nowy otwarty plik, nie współdzielony z  żadnym  innym  procesem.   (Ale
       współdzielone   otwarte   pliki  mogą  pochodzić  z  wywołania  funkcji
       systemowej fork(2).)  Nowt deskryptor pliku będzie  przekazywany  przez
       wywołania  funkcji  exec  (zobacz  fcntl(2)).   Przesunięcie pliku jest
       ustawiane na jego początek.

       Parametr flags to jedna z  wartości:  O_RDONLY,  O_WRONLY  lub  O_RDWR,
       które  stanowią, odpowiednio, żądania otwarcia tylko dla odczytu, tylko
       dla zapisu,  lub  dla  odczytu  i  zapisu.   Argument  flags  może  być
       połączony bitowym OR z zerem lub więcej spośród następujących wartości:

       O_CREAT
              Jeśli plik nie istnieje, to będzie  utworzony.   Właściciel  (ID
              użytkownika)   tego   pliku   jest  ustawiany  na  efektywny  ID
              użytkownika procesu. Grupa właściciela (ID grupy) jest ustawiana
              albo  na  efektywny  ID grupy procesu. albo na ID grupy katalogu
              nadrzędnego (w  zależności  od  rodzaju  systemu  plików,  opcji
              montowania  i  atrybutów  katalogu nadrzędnego, zobacz np. opcje
              montowania  bsdgroups  i  sysvgroups  dla  systemu  plików  ext2
              opisane w mount(8)).

       O_EXCL Gdy  zostanie  użyte  w  połączeniu z O_CREAT, to jeśli plik już
              istnieje, open się nie powiedzie. W  tym  kontekście  dowiązanie
              symboliczne jest istniejącym plikiem, niezależnie od tego, na co
              wskazuje.  O_EXCL nie działa jak należy na systemach plików NFS.
              Programy,  które  nadmiernie  ufają wykonywaniu przez open zadań
              blokowania, będą zawierać wyścig.  Rozwiązanie  dla  wykonywania
              atomowych  operacji  blokowania  plików  za pomocą pliku-blokady
              polega na utworzeniu unikalnego  pliku  na  tym  samym  systemie
              plików (np. wykorzystując nazwę hosta i PID) i użyciu link(2) do
              utworzenia dowiązania do pliku-blokady. Jeśli link()  zwróci  0,
              to  utworzenie  blokady się powiodło. W przeciwnym razie, należy
              użyć stat(2) na unikalnym pliku, aby sprawdzić, czy  ilość  jego
              dowiązań  wzrosła  do  2.   W takiej sytuacji utworzenie blokady
              również się powiodło.

       O_NOCTTY
              Jeśli pathname odnosi się do urządzenia terminalowego --  zobacz
              tty(4) -- to nie stanie się terminalem sterującym procesu, nawet
              jeśli proces takiego nie ma.

       O_TRUNC
              Jeśli plik już istnieje, jest zwykłym plikiem  i  tryb  otwarcia
              pozwala na zapis (tzn. jest to O_RDWR lub O_WRONLY), to plik ten
              zostanie obcięty do zerowej długości. Jeśli  plik  to  FIFO  lub
              urządzenie  terminalowe,  to znacznik O_TRUNC jest ignorowany. W
              pozostałych przypadkach  efekt  użycia  znacznika  O_TRUNC  jest
              nieokreślony.  (W wielu wersjach Linuksa zostanie zignorowany, w
              innych wersjach funkcja zwróci błąd.)

       O_APPEND
              Plik jest otwierany w trybie dopisywania. Przed  każdą  operacją
              write,  wskaźnik  pliku  jest  ustawiany  na koniec pliku, jak z
              lseek.  O_APPEND może prowadzić do zepsucia plików na  systemach
              plików  NFS,  gdy więcej niż jeden proces naraz dopisuje dane do
              pliku. Jest to związane z faktem, że NFS nie wspiera dopisywania
              do  pliku,  więc  jądro klienta musi to zasymulować, co nie może
              zostać wykonane bez wyścigu.

       O_NONBLOCK lub O_NDELAY
              Plik jest otwierany w trybie nieblokującym, o  ile  to  możliwe.
              Ani  open  ani  kolejne operacje na zwróconym przez to wywołanie
              deskryptorze nie spowodują  blokowania  procesu  (zatrzymania  w
              oczekiwaniu  na  dane,  itp.).  Szczegóły dotyczące obsługi FIFO
              (nazwanych potoków) można znaleźć w fifo(4).  Ten tryb może  nie
              mieć żadnego wpływu na pliki inne niż FIFO.

       O_SYNC Plik  jest  otwierany dla synchronicznego we/wy. Wszelkie zapisy
              write na otrzymanym  deskryptorze  pliku  będą  blokować  proces
              wołający  aż  do  fizycznego  zapisania  danych  na  odpowiednim
              nośniku.  Jednak, zobacz niej USTERKI.

       O_NOFOLLOW
              Jeśli pathname jest dowiązaniem symbolicznym,  to  otwarcie  się
              nie  powiedzie.  Jest  to  rozszerzenie  FreeBSD,  które zostało
              dodane do Linuksa w wersji 2.1.126.  Nadal  będzie  się  odbywać
              przechodzenie  po  dowiązaniach  symbolicznych we wcześniejszych
              składnikach  ścieżki.  Pliki  nagłówkome  w  glibc   2.0.100   i
              poźniejszych   zawierają   definicję   tego   znacznika.   Jdra
              poprzedzajce 2.1.126 zignoruj go, jeli jest uywany.

       O_DIRECTORY
              Jeśli  pathname  nie  jest  katalogiem,   spowoduje,   że   open
              zawiedzie.   Ten  znacznik jest specyficzny dla Linuksa i został
              do dany w kernelu  2.1.126,  aby  uniknąć  problemów  blokowania
              usług  (DoS),  gdy  opendir(3)  jest  wywołane  dla FIFO lub dla
              urządzenia  taśmowego,  ale  nie  powinno   być   używane   poza
              implementacją opendir.

       O_DIRECT
              Powoduje próbę zminimalizowania efektów związanych z buforowanie
              we/wy do i z tego  pliku.  Na  ogół  spowoduje  to  zmniejszenie
              wydajności, ale jest to przydatne w specyficznych sytuacjach, na
              przykład gdy aplikacje buforują we własnym zakresie.  We/wy  dla
              pliku odbywa się wówczas bezpośrednio z/do buforów w przestrzeni
              użytkownika.  We/wy  jest  sunchromiczne,  tzn.  po  zakończeniu
              funkcji  systemowej read(2) lub write(2) zagwarantowane jest, że
              dane  zostały  przeniesione.   Wielkości  przesyłanych   danych,
              wyrównania  buforów  w  przestrzeni  użytkownika  oraz pozycje w
              pliku muszą  być  wielokrotnościami  rozmiaru  logicznego  bloku
              systemu plików.
              Ten    znacznik    jest    wspierany    przez   wiele   systemów
              uniksopodobnych; w Linuksie, wsparcie zostało  dodane  w  jądrze
              wersji 2.4.10.
              Semantycznie  podobny interfejs dla urządzeń blokowych opisano w
              raw(8).

       O_ASYNC
              Generowanie sygnału (domyślnie SIGIO, ale można  go  zmienić  za
              pomocą fcntl(2)), gdy wejście lub wyjście poprzez ten deskryptor
              pliku staje się możliwe.  Ta funkcja jest dostępna  jedynie  dla
              terminali,  pseudoterminali  i  gniazd.  Więcej szczegółów można
              znaleźć w fcntl(2).

       O_LARGEFILE
              W systemach 32-bitowych, które wspierają obsługę  dużych  plików
              (LFS),  zezwala  na  otwieranie plików, których rozmiar nie może
              być reprezentowany jako liczba 31-bitowa.

       Pewne z tych znaczników można zmieniać za pomocą fcntl już po  otwarciu
       pliku.

       Argument  mode  określa  prawa,  które  będą  używane  do  ewentualnego
       tworzenia nowego pliku.  Są one  modyfikowane  przez  umask  procesu  w
       zwykły  sposób:  prawa  tworzonego  pliku  to  (mode & ~umask).  Należy
       zauważyć, że te uprawnienia dotyczą jedynie dostępu do nowo utworzonego
       pliku w przyszłości; wywołanie open, które tworzy plik tylko do obczytu
       może równie dobrze zwrócić deskryptor pliku do odczytu i zapisu.

       Dla parametru mode udostępniono następujące stałe symboliczne:

       S_IRWXU
              00700 użytkownik (właściciel pliku) ma prawa odczytu,  zapisu  i
              uruchamiania.

       S_IRUSR (S_IREAD)
              00400 użytkownik ma prawa odczytu.

       S_IWUSR (S_IWRITE)
              00200 użytkownik ma prawa zapisu.

       S_IXUSR (S_IEXEC)
              00100 użytkownik ma prawa uruchamiania.

       S_IRWXG
              00070 grupa ma prawa odczytu, zapisu i uruchamiania.

       S_IRGRP
              00040 grupa ma prawa odczytu.

       S_IWGRP
              00020 grupa ma prawa zapisu.

       S_IXGRP
              00010 grupa ma prawa uruchamiania.

       S_IRWXO
              00007 inni mają prawa odczytu, zapisu i uruchamiania.

       S_IROTH
              00004 inni mają prawa odczytu.

       S_IWOTH
              00002 inni mają prawa zapisu.

       S_IXOTH
              00001 inni mają prawa uruchamiania.

       mode  musi  być  podane,  gdy  w flags używany jest znacznik O_CREAT, w
       przeciwnym wypadku jest ignorowane.

       creat  jest  równoważne  open  z   argumentem   flags   ustawionym   na
       O_CREAT|O_WRONLY|O_TRUNC.

WARTOŚĆ ZWRACANA

       open  i creat zwracają nowy deskryptor pliku, lub -1 w wypadku błędu (w
       tym drugim wypadku  ustawiane  jest  też  odpowiednio  errno).   Należy
       zauważyć, że open może otwierać pliki urządzeń, lecz creat nie może ich
       tworzyć. Zamiast niego należy używać mknod(2).

       Na systemach NFS z  włączonym  mapowaniem  UID-ów,  open  może  zwrócić
       deskryptor  pliku,  dla  którego np. żadania read(2) są zabronione przy
       ustawionym EACCES. Jest to związane sprawdzanie uprawnień odbywa się na
       kliencie,  ale  to  serwer  wykonuje  moapowanie  UID-ów  podczas żądań
       odczytu i zapisu.

       Jeśli plik jest nowoutworzony, to jego pola atime,  ctime  i  mtime  są
       ustawione  na czas bieżący i to samo dotyczy pól ctime i mtime katalogu
       nadrzędnego.  Natomiast gdy plik  jest  modyfikowany  z  powodu  użycia
       znacznika  O_TRUNC,  jego  pola  ctime  i  mtime  są  ustawiane na czas
       bieżący.

BŁĘDY

       EEXIST pathname już istnieje, a użyto O_CREAT i O_EXCL.

       EISDIR pathname odnosi się do katalogu, a żądany był  dostęp  z  prawem
              zapisu (tzn. ustwine było O_WRONLY lub O_RDWR).

       EACCES Żądany  dostęp  do pliku nie jest dozwolony, jeden z katalogów w
              pathname nie ma praw przeszukiwania (wykonywania), lub plik  nie
              istnieje, a katalog nadrzędny nie ma praw zapisu.

       ENAMETOOLONG
              pathname było zbyt długie.

       ENOENT O_CREAT  nie  było  ustawione,  a  plik  o  zadanej  nazwie  nie
              istnieje.  Lub, składnik pathname, który powinien być katalogiem
              nie istnieje lub jest wiszącym dowiązaniem symbolicznym.

       ENOTDIR
              Składnik użyty w pathname jako katalog w rzeczywistości nie jest
              katalogiem  lub  podano  O_DIRECTORY,  a   pathname   nie   było
              katalogiem.

       ENXIO  Podano O_NONBLOCK | O_WRONLY, plik o zadanej nazwie stanowi FIFO
              i nie jest ono otwarte dla żadnego procesu do odczytu. Lub  plik
              jest   plikiem   urządzenia   specjalnego,  a  odpowiadające  mu
              urządzenie nie istnieje.

       ENODEV pathname  odnosi  się  do  pliku   urządzenia   specjalnego,   a
              odpowiadające mu urządzenie nie istnieje. (Jest to błąd w jądrze
              Linuksa - ENXIO powinno być zwracane w takiej sytuacji)

       EROFS  pathname odnosi się  do  pliku  na  systemie  plików  tylko  dla
              odczytu, a żądano otwarcia w trybie zapisu.

       ETXTBSY
              pathname  odnosi się do wykonywalnego obrazu, który obecnie jest
              wykonywany, a zażądano dostępu dla zapisu.

       EFAULT pathname  wskazuje  poza  dostępną  dla  użytkownika  przestrzeń
              adresową.

       ELOOP  Podczas  rozwiązywania  pathname  napotkano  zbyt wiele dowiązań
              symbolicznych lub podano O_NOFOLLOW, a pathname jest dowiązaniem
              symbolicznym.

       ENOSPC Gdy  pathname miało być utworzone, okazało się, że na urządzeniu
              na którym miało się znajdować brak miejsca na nowy plik.

       ENOMEM Brak dostępnej pamięci jądra.

       EMFILE Proces ma jyż otwartą maksymalną liczbę plików.

       ENFILE Osiągnięto ograniczenie dla łącznej liczby  otwartych  plików  w
              systemie.

ZGODNE Z

       SVr4,  SVID,  POSIX, X/OPEN, BSD 4.3 Znaczniki O_NOFOLLOW i O_DIRECTORY
       są  specyficzne  dla  Linuksa.  Aby  uzyskać  ich   definicje,   należy
       zdefiniować makro _GNU_SOURCE.

OGRANICZENIA

       Jest  wiele  nieszczęśliwości  w  protokole podległym NFS, dotykających
       między innymi O_SYNC i O_NDELAY.

       POSIX zapewnia trzy różne warianty synchronicznego we/wy, odpowiadające
       znacznikom  O_SYNC,  O_DSYNC  i O_RSYNC. Aktualnie (2.1.130) są one pod
       Linuksem synonimami.

ZOBACZ TAKŻE

       read(2), write(2), fcntl(2),  close(2),  link(2),  mknod(2),  mount(2),
       stat(2), umask(2), unlink(2), socket(2), fopen(3), fifo(4)