Jifunze amri ya Linux Open

Sahihi

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

Maelezo

Amri ya wazi () ya simu ya simu ya linux hutumiwa kubadili jina la njia kwenye faili descriptor (ndogo, isiyo na hasi integer kwa matumizi katika I / O inayofuata kama na kusoma , kuandika , nk). Wakati wito ukiwa na mafanikio, descriptor ya faili imerejezwa kuwa faili ya chini kabisa ya faili ambayo haifunguliwe kwa sasa kwa mchakato. Hangout hii inaunda faili mpya ya wazi, haijashirikiwa na mchakato mwingine wowote. (Lakini kushiriki files wazi inaweza kutokea kupitia simu (2) wito wa mfumo.) Faili mpya descriptor ni kuweka kubaki wazi katika kazi exec (angalia fcntl (2)). Kutoa faili ni kuweka mwanzo wa faili.

Bendera ya parameter ni moja ya O_RDONLY , O_WRONLY au O_RDWR ambayo inahitaji kufungua faili ya kusoma tu, kuandika pekee au kusoma / kuandika, kwa mtiririko huo, bitwise- au 'd kwa zero au zaidi ya yafuatayo:

O_CREAT

Ikiwa faili haipo haitakuwa imeundwa. Mmiliki (Kitambulisho cha mtumiaji) wa faili imewekwa kwenye Kitambulisho cha mtumiaji bora wa mchakato. Umiliki wa kikundi (Kitambulisho cha kikundi) kinawekwa kwenye Kitambulisho cha kikundi cha ufanisi cha mchakato au kwa Kitambulisho cha kikundi cha saraka ya wazazi (kulingana na aina ya mfumo wa faili na chaguzi za mlima, na hali ya saraka ya wazazi, angalia, kwa mfano, mlima chaguo bsdgroups na sysgroups ya mfumo wa faili wa ext2, kama ilivyoelezwa kwenye mlima (8)).

O_EXCL

Inapotumiwa na O_CREAT , ikiwa faili tayari ikopo ni kosa na wazi itashindwa. Katika muktadha huu, kiungo cha mfano kina, bila kujali ambapo inaelezea. O_EXCL imevunjwa kwenye mifumo ya faili ya NFS , programu ambazo hutegemea kwa kufanya kazi za kufungwa zitakuwa na hali ya mbio. Suluhisho la kufuatilia faili ya atomiki kwa kutumia lockfile ni kuunda faili ya kipekee kwenye fs sawa (kwa mfano, kuingiza jina la mwenyeji na pid), kutumia kiungo (2) ili kuunganisha kwenye kibofya. Ikiwa kiungo () kinarudi 0, lock ikofanikiwa. Vinginevyo, tumia stat (2) kwenye faili pekee ili uangalie ikiwa hesabu yake ya kiungo imeongezeka hadi 2, kwa hali hiyo lock pia imefanikiwa.

O_NOCTTY

Ikiwa jina la jina linamaanisha kifaa cha terminal --- tazama (4) --- haitakuwa terminal ya kudhibiti mchakato hata kama mchakato hauna moja.

O_TRUNC

Ikiwa faili tayari ipo na ni faili ya kawaida na hali ya wazi inaruhusu kuandika (yaani, ni O_RDWR au O_WRONLY) itatengwa kwa urefu wa 0. Kama faili ni FIFO au faili ya kifaa cha terminal, bendera ya O_TRUNC inachukuliwa. Vinginevyo, athari ya O_TRUNC haijulikani. (Kwa matoleo mengi ya Linux itapuuzwa; kwa matoleo mengine, itarudi kosa.)

O_APPEND

Faili inafunguliwa katika hali ya append. Kabla ya kila kuandika , pointer ya faili imewekwa mwishoni mwa faili, kama ilivyo kwa lseek . O_APPEND inaweza kusababisha faili zilizoharibiwa kwenye mifumo ya faili ya NFS ikiwa mchakato zaidi ya moja huongeza data kwenye faili mara moja. Hii ni kwa sababu NFS haiunga mkono kuingiza kwenye faili, hivyo kernel ya mteja inapaswa kuiiga, ambayo haiwezi kufanywa bila hali ya mbio.

O_NONBLOCK au O_NDELAY

Ikiwezekana, faili inafunguliwa kwa hali isiyozuia. Hakuna wazi au shughuli yoyote inayofuata kwenye faili ya faili ambayo inarudi itasababisha mchakato wa wito kusubiri. Kwa utunzaji wa FIFOs (zilizoitwa mabomba), angalia pia tano (4). Hali hii haipaswi kuwa na athari yoyote kwenye faili zingine isipokuwa FIFOs.

O_SYNC

Faili inafunguliwa kwa I / O ya synchronous. Yoyote ya kuandika kwenye faili ya faili inayosababisha itazuia mchakato wa wito mpaka data imeandikwa kimwili kwenye vifaa vya msingi. Angalia RESTRICTIONS chini, ingawa.

O_NOFOLLOW

Ikiwa jina la jina ni kiungo cha mfano, basi inafunguliwa wazi. Huu ni ugani wa FreeBSD, uliongezwa kwa Linux katika toleo 2.1.126. Viungo vyema katika vipengele vya awali vya jina la njia bado vitafuatwa. Vichwa kutoka glibc 2.0.100 na baadaye hujumuisha ufafanuzi wa bendera hii; kernels kabla ya 2.1.126 itapuuza ikiwa inatumiwa .

O_DIRECTORY

Ikiwa jina la jina sio saraka, fungua wazi kushindwa. Bendera hii ni maalum ya Linux, na imeongezwa katika toleo 2.1.126 ya kernel, ili kuepuka matatizo ya kukataa ya huduma ikiwa opendir (3) inaitwa kwenye FIFO au kifaa cha tepi, lakini haipaswi kutumiwa nje ya utekelezaji wa opendir .

O_DIRECT

Jaribu kupunguza madhara ya cache ya I / O na kutoka faili hii. Kwa ujumla hii itaharibu utendaji, lakini ni muhimu katika hali maalum, kama vile maombi yanafanya caching yao wenyewe. Faili I / O imefanywa moja kwa moja na / kutoka kwa buffers nafasi nafasi. I / O ni synchronous, yaani, wakati wa kukamilisha simu (2) au kuandika (2) mfumo, data imethibitishwa kuwa imehamishwa. Upeo wa uhamisho, na usawa wa buffer ya mtumiaji na faili ya kuzimwa lazima iwe kila aina ya ukubwa wa kuzuia mantiki ya mfumo wa faili.
Bendera hii inasaidiwa kwenye idadi ya mifumo ya Unix-kama; Msaada uliongezwa chini ya Linux katika toleo 2.4.10.
Kiambatanisho kinachofanana sawa na vifaa vya kuzuia kinaelezwa kwenye mbichi (8).

O_ASYNC

Kuzalisha ishara (SIGIO kwa default, lakini hii inaweza kubadilishwa kupitia fcntl (2)) wakati pembejeo au pato inavyowezekana kwenye maelezo ya faili hii. Kipengele hiki kinapatikana tu kwa vituo, vituo vya pseudo, na matako. Angalia fcntl (2) kwa maelezo zaidi.

O_LARGEFILE

Kwenye mifumo 32-bit inayounga mkono Mfumo wa Files Mkubwa, kuruhusu faili ambazo ukubwa hauwezi kusimamishwa katika bits 31 ili kufunguliwa.

Baadhi ya bendera hizi za hiari zinaweza kubadilishwa kwa kutumia fcntl baada ya faili kufunguliwa.

Hali ya hoja inafafanua ruhusa ya kutumia ikiwa kuna faili mpya. Imebadilishwa na umask wa mchakato kwa njia ya kawaida: ruhusa ya faili iliyoundwa ni (mode & ~ umask) . Kumbuka kuwa hali hii inatumika tu kwa upatikanaji wa baadaye wa faili iliyopangwa; wito wa wazi unaojenga faili tu ya kusoma inaweza kurudi maelezo ya kusoma / kuandika faili.

Vipengele vifuatavyo vinavyofuata hutolewa kwa mode :

S_IRWXU

Mtumiaji 00700 (mmiliki wa faili) amesoma, kuandika na kutekeleza idhini

S_IRUSR (S_IREAD)

Mtumiaji 00400 amesoma idhini

S_IWUSR (S_IWRITE)

Mtumiaji 00200 ana ruhusa ya kuandika

S_IXUSR (S_IEXEC)

Mtumiaji 00100 anafanya ruhusa

S_IRWXG

Kikundi cha 00070 kimesoma, kuandika na kutekeleza ruhusa

S_IRGRP

Kikundi cha 00040 kimesoma ruhusa

S_IWGRP

00020 kikundi kina ruhusa ya kuandika

S_IXGRP

00010 kundi linafanya ruhusa

S_IRWXO

Wengine 00007 wamesoma, kuandika na kutekeleza ruhusa

S_IROTH

00004 wengine wamesoma ruhusa

S_IWO

00002 wengine wameandika ruhusa

S_IXOTH

Wengine 00001 wamefanya ruhusa

mode lazima ifafanue wakati O_CREAT iko katika bendera , na inapuuzwa vinginevyo.

kuunda ni sawa kufungua na bendera sawa na O_CREAT | O_WRONLY | O_TRUNC .

PINDA KIFUNA

kufungua na kuunda kurudi maelezo ya faili mpya, au -1 ikiwa hitilafu ilitokea (katika hali hiyo, errno imewekwa ipasavyo). Kumbuka kuwa wazi inaweza kufungua faili maalum za kifaa, lakini kiumba hakiwezi kuunda - tumia mknod (2) badala yake.

Kwenye mifumo ya faili ya NFS na ramani ya UID imewezeshwa, kufungua inaweza kurudi maelezo ya faili lakini kwa mfano kusoma (2) maombi ni kukataliwa na EACCES . Hii ni kwa sababu mteja hufanya wazi kwa kuangalia ruhusa, lakini ramani ya UID inafanywa na seva juu ya maombi ya kusoma na kuandika.

Ikiwa faili imefungwa hivi karibuni, chumvi zake, ctime, mashamba ya mtime yanawekwa wakati wa sasa, na hivyo ndio orodha ya machapisho na mtime ya saraka ya mzazi. Vinginevyo, ikiwa faili imebadilishwa kwa sababu ya bendera ya O_TRUNC, msimu wake na mashamba ya mtime yamewekwa wakati wa sasa.

Hitilafu

EEXIST

Njia tayari iko na O_CREAT na O_EXCL zilitumiwa.

EISDIR

pathname inahusu saraka na ufikiaji unaohusika unaohusika kuandika (yaani, O_WRONLY au O_RDWR imewekwa).

EACCES

Ufikiaji uliotakiwa wa faili haukuruhusiwa, au mojawapo ya miongozo katika njia ya jina haikuruhusu kutafuta (kutekeleza) idhini, au faili haikuwepo bado na kuandika upatikanaji wa saraka ya wazazi hairuhusiwi.

ENAMETOOLONG

Njia ya muda ilikuwa ndefu sana.

JUMA

O_CREAT haijawekwa na faili iliyoitwa haipo. Au, kipengee cha saraka katika jina la cheti haipo au ni kiungo cha kuashiria cha kuvutia.

ENOTDIR

Kipengele kinachotumiwa kama saraka kwa njia ya jina si, kwa kweli, saraka, au O_DIRECTORY imetajwa na jina la njia sio saraka.

ENXIO

O_NONBLOCK | O_WRONLY imewekwa, faili iliyoitwa ni FIFO na hakuna mchakato una faili inayofunguliwa kwa kusoma. Au, faili ni faili maalum ya kifaa na hakuna kifaa sambamba kilichopo.

ENODEV

pathname inahusu faili maalum ya kifaa na hakuna kifaa sambamba kilichopo. (Hii ni mdudu wa kernel Linux - katika hali hii ENXIO lazima irudiwe.)

EROFS

pathname inahusu faili kwenye mfumo wa faili tu wa kusoma na kuandika upatikanaji uliombwa.

ETXTBSY

pathname inahusu picha inayoweza kutekelezwa ambayo kwa sasa imefanyika na kuandika upatikanaji iliombwa.

EFAULT

Njia ya njia ina nje ya nafasi yako ya kufikia anwani.

ELOOP

Viungo vingi vya mfano vilikutana na kutatua njia ya jina , au O_NOFOLLOW ilielezwa lakini jina la njia lilikuwa kiungo cha mfano.

ENOSPC

Njia ilipaswa kuundwa lakini kifaa kilicho na pathname haina nafasi ya faili mpya.

ENOMEM

Kumbukumbu ya kernel haitoshi ilikuwa inapatikana.

EMFILE

Mchakato tayari una idadi kubwa ya faili zilizo wazi.

FUNGWA

Kikomo juu ya idadi ya faili zilizofunguliwa kwenye mfumo imefikiwa.

Inafanana na

SVr4, SVID, POSIX, X / OPEN, BSD 4.3 Bendera za O_NOFOLLOW na O_DIRECTORY ni Linux- maalum. Mtu anaweza kufafanua _GNU_SOURCE macro ili kupata ufafanuzi wao.

Vikwazo

Kuna uovu wengi katika itifaki ya msingi ya NFS, inayoathiri miongoni mwao O_SYNC na O_NDELAY .

POSIX hutoa vigezo tatu tofauti vya I / O iliyosawazishwa, sawa na bendera O_SYNC , O_DSYNC na O_RSYNC . Hivi sasa (2.1.130) haya yote ni sawa na chini ya Linux.