Saznajte Linux Command Open

Sinopsis

#include << A HREF = "file: /usr/include/sys/types.h"> sys / types.h> # uključi << A HREF = "datoteka: /usr/include/sys/stat.h"> sys / stat.h> #include << A HREF = "file: /usr/include/fcntl.h"> fcntl.h> int otvoren (const char * putni naziv , int flags ); otvoriti int (const char * putni naziv , int flag , način mode_t ); int creat (const char * putanje , način rada_t );

Opis

Naredba Linux otvorenog () naziva sustava koristi se za pretvaranje naziva stabla u deskriptor datoteka (mali, ne-negativni cijeli broj za upotrebu u kasnijim I / O kao i kod čitanja , pisanja itd.). Kada je poziv uspješan, descriptor datoteka vratit će se kao najniži deskriptor datoteka koji trenutno nije otvoren za taj proces. Ovaj poziv stvara novu otvorenu datoteku koja se ne dijeli s drugim postupkom. (Ali zajedničke otvorene datoteke mogu se pojaviti preko pozivnog sustava za vilicu (2).) Novi deskriptor datoteka postavljen je da ostane otvoren za sve izvršne funkcije (vidi fcntl (2)). Offset datoteke je podešen na početak datoteke.

Parametri zastavice su jedan od O_RDONLY , O_WRONLY ili O_RDWR koji zahtijevaju otvaranje datoteke samo za čitanje, samo za pisanje ili čitanje / pisanje, bitno ili 'd s nula ili više od sljedećeg:

O_CREAT

Ako datoteka ne postoji, bit će stvoren. Vlasnik (korisnički ID) datoteke je postavljen na učinkovit korisnički ID procesa. Vlasništvo grupe (ID grupa) postavljeno je ili na učinkovitu grupnu ID procesa ili na ID grupe nadređenog imenika (ovisno o vrsti datotečnog sustava i opcijama pri montaži i načinu nadređenog imenika, vidi npr. Montiranje opcije bsdgroups i sysvgroups ekst2 datotečnog sustava, kako je opisano u sklopu (8)).

O_EXCL

Kada se koristi s O_CREAT , ako datoteka već postoji, to je pogreška, a otvoreni će uspjeti. U tom kontekstu postoji simbolična veza, bez obzira na to gdje to ukazuje. O_EXCL je slomljen na NFS datotečnim sustavima , programi koji se oslanjaju na to za obavljanje zadataka zaključavanja sadržavat će stanje utrke. Rješenje za zaključavanje atomske datoteke pomoću zaključanog zapisa je stvaranje jedinstvene datoteke na istom fs (npr. Ugrađivanje naziva hosta i pid), korištenje veze (2) kako bi se povezala s zaporkom. Ako veza () vrati 0, zaključavanje je uspješno. U suprotnom, upotrijebite stat (2) na jedinstvenoj datoteci da biste provjerili je li broj veza povećao na 2, u kojem slučaju i zaključavanje je uspješno.

O_NOCTTY

Ako se naziv staze odnosi na terminalni uređaj - vidi tty (4) - neće postati terminal za upravljanje procesom, čak i ako ga proces ne posjeduje.

O_TRUNC

Ako datoteka već postoji i redovna je datoteka, a otvoreni način rada omogućuje pisanje (tj. O_RDWR ili O_WRONLY), to će biti skraćeno na duljinu 0. Ako je datoteka FIFO ili datoteka terminala, O_TRUNC zastava se zanemaruje. Inače, učinak O_TRUNC nije određen. (Na mnogim Linux verzijama bit će zanemareno, a na ostalim će verzijama vratiti pogrešku.)

O_APPEND

Datoteka je otvorena u načinu dodavanja. Prije svakog pisanja , pokazivač datoteke nalazi se na kraju datoteke, kao kod lseeka . O_APPEND može dovesti do oštećenih datoteka na NFS datotečnim sustavima ako više od jednog procesa doda podatke u datoteku odjednom. To je zato što NFS ne podržava pridruživanje datoteci, tako da je kernel klijenta mora simulirati, što se ne može učiniti bez uvjeta utrke.

O_NONBLOCK ili O_NDELAY

Kad je moguće, datoteka se otvara u načinu bez blokiranja. Niti ni otvoreni ni nikakvi kasniji postupci na datotečnom datoteku koji se vraća neće uzrokovati da proces pozivanja čeka. Za rukovanje FIFO-ima (nazvanim cijevi), pogledajte također FIFO (4). Ovaj način ne smije imati nikakav učinak na druge datoteke osim FIFO-a.

O_SYNC

Datoteka je otvorena za sinkroni I / O. Svako pisanje s na opisanom deskriptoru datoteke blokirat će proces pozivanja sve dok se podaci fizički ne zapisuju na temeljni hardver. Ipak, pogledajte OGRANIČENJA.

O_NOFOLLOW

Ako je naziv putanje simbolička veza, otvoreni program ne uspijeva. Ovo je FreeBSD produžetak, koji je dodan u Linux u verziji 2.1.126. I dalje će se slijediti simboličke veze u ranijim komponentama staze. Zaglavlja s glibc 2.0.100 i novijih sadrže definiciju te zastave; kernele prije 2.1.126 će ga ignorirati ako se koriste .

O_DIRECTORY

Ako putanje nije direktorij, prouzročite da se otvoreni ne uspije. Ova zastava je specifična za Linux i dodana je u verziju 2.1.126 kernela, kako bi se izbjegli problemi s uskraćivanjem servisa ako se opendir (3) zove na FIFO ili vrpcu, ali se ne smije koristiti izvan implementacije opendira ,

O_DIRECT

Pokušajte minimizirati efekte predmemorije I / O na i iz ove datoteke. Općenito to će degradirati performanse, ali je korisno u posebnim situacijama, primjerice kada aplikacije vrše svoje predmemoriranje. Datoteka I / O se vrši izravno na / iz korisničkih pufera. I / O je sinkroniziran, tj. Na završetku poziva sustava za očitavanje (2) ili pisanje (2) podataka je zajamčeno da su podaci preneseni. Veličine prijenosa i poravnavanje korisničkih međuspremnika i datoteka moraju biti višekratnici logičke veličine datotečnog sustava.
Ta je oznaka podržana na više Unixovih sustava; podrška je dodana pod Linuxom u verziji 2.4.10 kernela.
Semantski slično sučelje za blokove uređaja opisano je u sirovom (8).

O_ASYNC

Generirajte signal (SIGIO prema zadanim postavkama, ali to se može promijeniti pomoću fcntl (2)) kada ulaz ili izlaz postaje moguć na ovom deskriptoru datoteka. Ova je značajka dostupna samo za terminale, pseudo-terminale i utičnice. Za daljnje pojedinosti pogledajte fcntl (2).

O_LARGEFILE

Na 32-bitnim sustavima koji podržavaju Large Files System, dozvoljavaju se datoteke čije se veličine ne mogu prikazati u 31 bita da budu otvorene.

Neke od ovih dodatnih zastavica mogu se mijenjati pomoću fcntl nakon otvaranja datoteke.

Način argumenta određuje dopuštenja za upotrebu u slučaju stvaranja nove datoteke. Izmijenjeno je umaskom procesa na uobičajeni način: dopuštenja stvorene datoteke su (način & ~ umask) . Imajte na umu da se ovaj način odnosi samo na buduće pristupnice novo stvorene datoteke; otvoreni poziv koji stvara datoteku samo za čitanje može dobro vratiti deskriptor datoteka za čitanje / pisanje.

Sljedeće simboličke konstante su predviđene za način rada :

S_IRWXU

00700 korisnik (vlasnik datoteke) je pročitao, napisao i izvršio dozvolu

S_IRUSR (S_IREAD)

00400 korisnik je pročitao dopuštenje

S_IWUSR (S_IWRITE)

00200 korisnik ima dopuštenje za pisanje

S_IXUSR (S_IEXEC)

Korisnik 00100 izvršio je dopuštenje

S_IRWXG

00070 grupa je pročitao, napisao i izvršio dozvolu

S_IRGRP

00040 grupa je pročitala dopuštenje

S_IWGRP

00020 grupa ima dopuštenje za pisanje

S_IXGRP

00010 grupa je izvršila dopuštenje

S_IRWXO

00007 drugi su pročitali, pisali i izvršili dopuštenje

S_IROTH

Ostali 00004 imaju dopuštenje za čitanje

S_IWOTH

Ostali 00002 imaju dopuštenje za pisanje

S_IXOTH

00001 ostali su izvršili dopuštenje

mora biti naveden kada je O_CREAT u zastavama , a inače se zanemaruje.

Creat je ekvivalent za otvaranje sa zastavicama jednakima O_CREAT | O_WRONLY | O_TRUNC .

POVRATNA VRIJEDNOST

otvoriti i creat vratiti novi deskriptor datoteka, ili -1 ako se dogodila pogreška (u tom slučaju, errno je postavljen na odgovarajući način). Imajte na umu da otvoreni mogu otvoriti posebne datoteke uređaja, ali ih kreat ne može stvoriti - umjesto toga koristite mknod (2).

Na NFS datotečnim sustavima s mogućnošću mapiranja UID omogućen, otvoren može vratiti deskriptor datoteka, ali npr. Čitanje (2) zahtjevi odbijeni su s EACCES . To je zato što klijent izvodi provjerom dozvola, ali UID kartiranje obavlja poslužitelj nakon čitanja i pisanja zahtjeva.

Ako je datoteka nedavno kreirana, njegovi atime, ctime, mtime polja su postavljeni na trenutačno vrijeme, kao i polja ctime i mtime roditeljskog direktorija. U suprotnom, ako je datoteka izmijenjena zbog oznake O_TRUNC, polja ctime i mtime postavljena su na trenutačno vrijeme.

greške

EEXIST

putanje već postoji i upotrebljeni su O_CREAT i O_EXCL .

EISDIR

putanje se odnosi na direktorij, a zahtijevani pristup koji se odnosi na pisanje (tj. postavljen je O_WRONLY ili O_RDWR ).

EACCES

Zatraženi pristup datoteci nije dopušten ili jedan od direktorija u putu ne dopušta dozvolu za pretraživanje (izvršavanje) ili datoteka još nije postojala i nije dopušten pristup pisma roditeljskog direktorija.

ENAMETOOLONG

put je bio predug.

ENOENT

O_CREAT nije postavljen i navedena datoteka ne postoji. Ili, komponenta direktorija u nazivu staze ne postoji ili je impulsna simbolična veza.

ENOTDIR

Komponenta koja se koristi kao direktorij u putanju nije zapravo imenik, ili je O_DIRECTORY naveden, a naziv staze nije bio direktorij.

ENXIO

O_NONBLOCK | O_WRONLY je postavljen, nazvana datoteka je FIFO i nema procesa koji ima otvorenu datoteku za čitanje. Ili, datoteka je posebna datoteka uređaja i ne postoji odgovarajući uređaj.

ENODEV

put se odnosi na posebnu datoteku uređaja i nema odgovarajućeg uređaja. (Ovo je Linux kernel bug - u ovoj situaciji ENXIO se mora vratiti.)

EROFS

put se odnosi na datoteku na read-only datotečnom sustavu i pristup za pisanje je zatražen.

ETXTBSY

put se odnosi na izvršnu sliku koja se trenutno izvršava i zahtijeva se pristup za pisanje.

EFAULT

putničkih točaka izvan vašeg dostupnog adresnog prostora.

ELOOP

Prilikom rješavanja imena staze naišli su previše simboličkih veza, ili je naveden O_NOFOLLOW , no putanje je simbolička veza.

ENOSPC

trebalo je izraditi putanje , ali uređaj koji sadrži putanje nema mjesta za novu datoteku.

ENOMEM

Dostupna je nedovoljna memorija jezgre.

EMFILE

Proces već ima maksimalan broj datoteka otvorenih.

ENFILE

Dosegnuto je ograničenje ukupnog broja otvorenih datoteka na sustavu.

U skladu s

SVr4, SVID, POSIX, X / OPEN, BSD 4.3 Zastavice O_NOFOLLOW i O_DIRECTORY su Linux specifične. Možda ćete morati definirati _GNU_SOURCE makronaredbu kako biste dobili njihove definicije.

ograničenja

Postoje mnoge nevjere u protokolu koji se temelje na NFS-u, koji utječu između ostalog O_SYNC i O_NDELAY .

POSIX pruža tri različite varijante sinkroniziranog I / O, koji odgovaraju zastavama O_SYNC , O_DSYNC i O_RSYNC . Trenutno (2.1.130) sve su to sinonimne pod Linuxom.