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¶
Uwaga! To tłumaczenie może być nieaktualne!
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 niżej
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. Jądra
poprzedzające 2.1.126 zignorują go, jeśli jest
używany.
- 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)
Powyższe tłumaczenie pochodzi z nieistniejącego już Projektu
Tłumaczenia Manuali i
może nie być aktualne. W razie
zauważenia różnic między powyższym opisem a
rzeczywistym zachowaniem opisywanego programu lub funkcji, prosimy o
zapoznanie się z oryginalną (angielską) wersją strony
podręcznika za pomocą polecenia:
- man --locale=C 2 open
Prosimy o pomoc w aktualizacji stron man - więcej informacji można
znaleźć pod adresem
http://sourceforge.net/projects/manpages-pl/.