open

Autres langues

Langue: pl

Autres versions - même langue

Version: 1999-06-03 (openSuse - 09/10/07)

Autres sections - même nom

Section: 2 (Appels système)

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 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)