Provided by:
manpages-pl-dev_20060617-1_all 
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)