open, creat - otwarcie i utworzenie pliku lub
urządzenia
#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);
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.
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.
- 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.
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.
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.
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/.