Rechercher une page de manuel

Chercher une autre page de manuel:

open

Autres langues

Langue: pl

Version: 1999-06-03 (ubuntu - 01/11/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)
Il n'y a pas de pile sous MultiDeskOS. Les fonctions ne sont pas encore récursives,
mais le seront par la suite, via des assignations de variables... Ce qui évitera de
devoir créer des pile et d'avoir des stack overflow.
-- Jayce - Les piles sa pu aussi --