Lernu la Linulan Komandon Malfermitan

Sinopsis

#include << HREF = "dosiero: /usr/include/sys/types.h"> sys / types.h> #include << A HREF = "dosiero: /usr/include/sys/stat.h"> sys / stat.h> #include << HREF = "dosiero: /usr/include/fcntl.h"> fcntl.h> int malferma (const char * pathname , int flags ); int malferma (const char * pathname , int flags , mode_t mode ); int kreo (const char * pathname , mode_t mode );

Priskribo

La sistemo malfermita () nomita linux- komando estas uzata por konverti dosiernomon al dosiero-priskribilo (malgranda, ne-negativa entjero por uzo en posta I / O kiel kun legado , skribo ktp.). Kiam la alvoko estas sukcesa, la dosiero- priskribilo estos la plej malalta dosiero-priskribilo, ne aktuale malfermita por la procezo. Ĉi tiu voko kreas novan malfermitan dosieron, ne dividitan kun iu ajn alia procezo. (Sed dividitaj dosieroj povas ŝpruci per la voka sistemo (2).) La nova dosiero priskribas resti malfermita trans ekzec- funkcioj (vidu fcntl (2)). La dosiero kompensita estas al la komenco de la dosiero.

La parametraj flagoj estas unu el O_RDONLY , O_WRONLYO_RDWR, kiuj petas malfermi la dosieron nur-legita, nur skribi aŭ legi / skribi, bicie- 'd kun nulo aŭ pli da jenaj:

O_CREAT

Se la dosiero ne ekzistas, ĝi estos kreita. La posedanto (uzanto-ID) de la dosiero estas agordita al la efika uzanto-ID de la procezo. La grupa posedaĵo (grupa ID) estas fiksita al la efika grupa ID de la procezo aŭ al la grupo ID de la gepatra dosierujo (depende de dosieraj tipoj kaj muntaj elektoj, kaj la modon de la gepatra adresaro, vidu, ekzemple, la monto ebloj bsdgroups kaj sysvgroups de la sistemo de dosieroj ext2, kiel priskribita en monto (8)).

O_EXCL

Kiam oni uzas kun O_CREAT , se la dosiero jam ekzistas, tio estas eraro kaj la malfermo malsukcesos. En ĉi tiu kunteksto ekzistas simbola ligo, sendepende de kie ĝiaj punktoj. O_EXCL estas rompita sur sistemoj de dosieroj NFS , programoj, kiuj dependas de ĝi por plenumi blokajn taskojn, enhavos raskondiĉon . La solvo por agordi atoman dosieron per lockfile estas krei unikan dosieron en la sama fs (ekz., Korpigante gastignomon kaj pid), uzu ligilon (2) por fari ligilon al la ŝlosilo. Se ligilo () revenas 0, la seruro estas sukcesa. Alie, uzu stat (2) sur la unika dosiero por kontroli se ĝia ligo-kalkulo pliiĝis al 2, en kies kazo la seruro ankaŭ sukcesas.

O_NOCTTIO

Se padnomo aludas al fina stacio - vidu tty (4) --- ĝi ne fariĝos la fina stacio de la procezo eĉ se la procezo ne havas unu.

O_TRUNC

Se la dosiero jam ekzistas kaj estas regula dosiero kaj la malferma reĝimo permesas skribi (tio estas, O_RDWR aŭ O_WRONLY) ĝi estos detranĉita ĝis longeco 0. Se la dosiero estas FIFO aŭ fina stacio, la O_TRUNC-flago estas ignorita. Alie, la efiko de O_TRUNC estas ne specifita. (En multaj Linuksaj versioj ĝi estos ignorita; sur aliaj versioj, ĝi redonos eraron.)

O_APPEND

La dosiero estas malfermita en apend-modo. Antaŭ ĉiu skribo , la dosiero-puntero situas ĉe la fino de la dosiero, kvazaŭ kun lseek . O_APPEND povas konduki al difektitaj dosieroj en sistemoj de dosieroj NFS se pli ol unu procezo tuj aldonas datumojn al dosiero. Ĉi tio estas pro tio, ke NFS ne subtenas ĉeestanta dosieron, do la kliento kerno devas simuli ĝin, kio ne povas esti farita sen kuro-kondiĉo.

O_NONBLOCKO_NDELAY

Kiam eblas, la dosiero malfermiĝas en ne-blokanta reĝimo. Nek la malfermaj nek ia ajn postaj operacioj en la dosiero-priskribilo, kiu redonas, kaŭzos la nomitan procezon atendi. Por la uzado de FIFO (nomitaj tubaroj), vidu ankaŭ fifo (4). Ĉi tiu reĝimo bezonas neniun efikon en dosieroj krom FIFO.

O_SYNC

La dosiero malfermiĝas por sinkronigita I / O. Ajna skribo sur la rezultanta dosiero priskribos la nomitan procezon ĝis la datumoj estis fizike skribitaj al la suba aparataro. Vidu RESTRICTIONS sube, tamen.

O_NOFOLLOW

Se la pomnomo estas simbola ligo, tiam la malferma fiasko. Ĉi tio estas etendo de FreeBSD, kiu estis aldonita al Linukso en la versio 2.1.126. Simbolaj ligoj en pli fruaj komponantoj de la pasnomo ankoraŭ sekvos. La titoloj de glibc 2.0.100 kaj poste inkluzivas difinon de ĉi tiu flago; kernoj antaŭ 2.1.126 ignoros ĝin se uzata .

O_DIRECTORO

Se pathname ne estas dosierujo, malhelpu la malfermon. Ĉi tiu flago estas Linukso-specifa, kaj estis aldonita en la kerno versio 2.1.126, por eviti negativajn problemojn, se opendanto (3) vokas FIFO aŭ bendan aparaton, sed ne devus esti uzata ekster la apliko de opendanto .

O_DIRECT

Provu minimumigi la kaŝmemorojn de la I / O al kaj de ĉi tiu dosiero. Ĝenerale ĉi tio degrados agadon, sed ĝi utilas en specialaj situacioj, kiel kiam aplikoj faras sian propran caching. Dosiero I / O fariĝas rekte al / de uzantaj spacaj bubistoj. La I / O sinkronigas, kio estas, kiam la finaĵo de la legado (2) aŭ skribi (2) sistemon vokas, la datumoj garantias esti transferitaj. Transferi grandecoj, kaj la alineo de uzanto bufilo kaj dosiero-kompenso devas ĉiuj esti multiplikoj de la logika bloko-grandeco de la dosiera sistemo.
Ĉi tiu flago estas subtenata en kelkaj Uniks-similaj sistemoj; Subteno estis aldonita sub Linukso en kerno versio 2.4.10.
Semantike simila interfaco por blokaj aparatoj estas priskribita en kruda (8).

O_ASYNC

Generas signalon (SIGIO defaŭlte, sed ĉi tio povas esti ŝanĝita per fcntl (2)) kiam enigo aŭ eligo fariĝas ebla en ĉi tiu dosiero-priskribilo. Ĉi tiu trajto nur estas disponebla por fina stacioj, pseŭdo-fina stacioj kaj sockets. Vidu fcntl (2) por pliaj detaloj.

O_LARGEFILE

En 32-bitaj sistemoj, kiuj subtenas la Grandajn Dosierajn Sistemojn, permesas dosierojn kies grandecoj ne povas esti reprezentitaj en 31 bitoj por esti malfermitaj.

Iuj de ĉi tiuj laŭvolaj flagoj povas esti ŝanĝitaj per fcntl post kiam la dosiero malfermiĝis.

La argumenta reĝimo specifas la permesojn por uzi en la okazo ke nova dosiero estas kreita. Ĝi estas modifita de la procezo umask en la kutima maniero: la permesoj de la kreita dosiero estas (reĝimo kaj ~ umask) . Notu, ke ĉi tiu reĝimo nur aplikas al estontaj aliroj de la lastatempe kreita dosiero; la malferma voko, kiu kreas nur-legatan dosieron, povas bone redoni priskribon de dosiero de legado / skribo.

La jenaj simbolaj konstantaj estas provizitaj por maniero :

S_IRWXU

Uzanto de uzanto (dosiero posedanto) de 00700 legis, skribas kaj ekzekutas permeson

S_IRUSR (S_IREAD)

Uzanto de 00400 permesis legi

S_IWUSR (S_IWRITE)

Uzanto de 00200 rajtas skribi

S_IXUSR (S_IEXEC)

00100 uzanto plenumas permeson

S_IRWXG

00070-grupo legis, skribis kaj ekzekutis permeson

S_IRGRP

00040 grupo legis permeson

S_IWGRP

00020-grupo havas skriban permeson

S_IXGRP

00010 grupo plenumas permeson

S_IRWXO

00007 aliaj legis, skribis kaj ekzekutis permeson

S_IROTH

00004 aliaj legis permeson

S_IWOTH

00002 aliaj havas skriban permeson

S_IXOTH

00001 aliaj ekzekutas permeson

Modo devas esti specifita kiam O_CREAT estas en la flagoj , kaj estas ignorata alie.

kreaĵo estas ekvivalenta malfermi kun flagoj egalaj al O_CREAT | O_WRONLY | O_TRUNC .

REKUKA VALO

malferma kaj kreita reveno de la nova dosiero-priskribilo, aŭ -1 se okazis eraro (en tiu kazo, errno fiksas taŭge). Notu, ke malfermita povas malfermi specialajn dosierojn de aparato, sed kreo ne povas krei ilin - anstataŭe uzi mknod (2).

En la sistemoj de arkivoj de NFS kun ebligado de mapado de UID, malfermita povas reveni dosieron priskribilo, sed ekzemple legi (2) petoj estas malkonfirmitaj kun EACCES . Ĉi tio estas, ĉar la kliento plenumas malfermante la permesojn, sed la servilo de UID estas farita de la servilo post legi kaj skribi petojn.

Se la dosiero estas lastatempe kreita, ĝia atime, ctime, mtime-kampoj estas agorditaj al la nuna tempo, kaj do estas la kampoj kaj tempoj de la gepatra adresaro. Alie, se la dosiero estas modifita pro la O_TRUNC-flago, ĝiaj ctime kaj mtime-kampoj estas agorditaj al la nuna tempo.

Eraroj

EEXIST

pathname jam ekzistas kaj O_CREAT kaj O_EXCL estis uzataj.

EISDIR

pathname rilatas al dosierujo kaj la aliro petita skribita implikita (tio estas, O_WRONLYO_RDWR estas aro).

EACCES

La petita aliro al la dosiero ne estas permesita, aŭ unu el la dosierujoj en la nomo ne eblis serĉi (ekzekuti) permeson, aŭ la dosiero ankoraŭ ne ekzistis kaj skribi aliron al la gepatra dosierujo ne estas permesita.

ENAMETOOLONG

La nomnomo estis tro longa.

ENOENT

O_CREAT ne estas aro kaj la nomata dosiero ne ekzistas. Aŭ, dosierujo-komponanto en pathnomo ne ekzistas aŭ estas ŝvela simbola ligo.

ENOTDIR

Komponanto uzita kiel dosierujo en pathnomo ne estas fakte dosierujo aŭ O_DIRECTORIO specifita kaj pathname ne estis dosierujo.

ENXIO

O_NONBLOCK | O_WRONLY estas aro, la nomata dosiero estas FIFO kaj neniu procezo malfermas la dosieron por legi. Aŭ, la dosiero estas speciala dosiero de aparato kaj neniu responda aparato ekzistas.

ENODEV

pathname rilatas al speciala dosiero de aparato kaj ne ekzistas responda aparato. (Ĉi tio estas kerno de Linukso-kerno - en ĉi tiu situacio ENXIO devas esti redonita.)

EROFS

pathname raportas al dosiero sur dosieruja sistemo de legado kaj skribita aliro estis petita.

ETXTBSY

pathname rilatas al ejektivebla bildo, kiu nun estas ekzekutita kaj skribis aliron.

EFAULT

vojnivelaj punktoj ekster via alirebla adreso-spaco.

ELOOP

Tro da simbolaj ligoj estis renkontitaj en solvado de la nomo , aŭ O_NOFOLLOW estis precizigita, sed la nomo nomiĝis simbola ligo.

ENOSPC

pathname estis kreita sed la aparato enhavanta pathnomon ne havas lokon por la nova dosiero.

ENOMEM

Malsukcesa kerno-memoro estis havebla.

EMFILE

La procezo jam havas la maksimuman nombro da dosieroj malfermitaj.

INFILE

La limo sur la tuta nombro da dosieroj malfermitaj sur la sistemo estis atingita.

Konformanta al

SVr4, SVID, POSIX, X / OPEN, BSD 4.3 La O_NOFOLLOW kaj O_DIRECTORY- flagoj estas Linukso -specificaj. Oni eble devas difini la _GNU_SOURCE_ macro por akiri iliajn difinojn.

Restriktoj

Estas multaj malfeliĉoj en la protokolo suba NFS, efikante inter aliaj O_SYNC kaj O_NDELAY .

POSIX provizas tri malsamajn variantojn de sinkronigita I / O, responda al la flagoj O_SYNC , O_DSYNC kaj O_RSYNC . Nuntempe (2.1.130) ĉi tiuj estas ĉiuj sinónimos sub Linukso.