Alamin ang Linux Command Open

Buod

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

Paglalarawan

Ang bukas () system call linux command ay ginagamit upang i-convert ang pathname sa isang file descriptor (isang maliit, di-negatibong integer para sa paggamit sa kasunod na I / O tulad ng sa read , write , atbp.). Kapag ang tawag ay matagumpay, ang file descriptor na ibalik ay ang pinakamababang file descriptor na hindi kasalukuyang bukas para sa proseso. Ang tawag na ito ay lumilikha ng isang bagong bukas na file, hindi ibinahagi sa anumang iba pang proseso. (Ngunit ang mga nakabukas na bukas na file ay maaaring lumitaw sa pamamagitan ng sistema ng tinidor (2).) Ang bagong file descriptor ay nakatakda upang manatiling bukas sa mga function ng exec (tingnan ang fcntl (2)). Ang file offset ay nakatakda sa simula ng file.

Ang mga parameter na flag ay isa sa O_RDONLY , O_WRONLY o O_RDWR na humiling ng pagbubukas ng file na read-only, write-only o read / write, ayon sa pagkakabanggit, bitwise- o 'd sa zero o higit pa sa mga sumusunod:

O_CREAT

Kung ang file ay hindi umiiral ito ay malilikha. Ang may-ari (user ID) ng file ay naka-set sa epektibong user ID ng proseso. Ang pagmamay-ari ng grupo (grupo ID) ay nakatakda sa alinman sa epektibong ID ng grupo ng proseso o sa ID ng grupo ng direktoryo ng magulang (depende sa uri ng filesystem at mga pagpipilian ng bundok, at ang mode ng direktoryo ng magulang, tingnan ang hal. mga pagpipilian bsdgroups at sysvgroups ng ext2 filesystem, tulad ng inilarawan sa mount (8)).

O_EXCL

Kapag ginamit sa O_CREAT , kung umiiral na ang file, ito ay isang error at bukas ay mabibigo. Sa kontekstong ito, umiiral ang isang makahulugan na link, anuman ang mga punto nito. Ang O_EXCL ay nasira sa mga sistema ng file ng NFS , ang mga program na umaasa sa mga ito para sa pagganap ng mga gawain sa pagla-lock ay maglalaman ng kondisyon ng lahi. Ang solusyon para sa pagsasagawa ng pag-lock ng atomic file gamit ang lockfile ay upang lumikha ng isang natatanging file sa parehong fs (hal., Kasama ang hostname at pid), gamitin ang link (2) upang gumawa ng isang link sa lockfile. Kung ang link () ay nagbabalik ng 0, ang kandado ay matagumpay. Kung hindi, gamitin ang stat (2) sa natatanging file upang suriin kung ang bilang ng link nito ay tumaas sa 2, kung saan ang kandado ay matagumpay din.

O_NOCTTY

Kung ang pathname ay tumutukoy sa isang aparato ng terminal --- tingnan ang tty (4) --- hindi ito magiging proseso ng pagkontrol ng terminal kahit na ang proseso ay walang isa.

O_TRUNC

Kung umiiral na ang file at isang regular na file at ang bukas na mode ay nagbibigay-daan sa pagsulat (ibig sabihin, ay O_RDWR o O_WRONLY) ito ay pinutol sa haba 0. Kung ang file ay isang FIFO o terminal device file, ang O_TRUNC flag ay hindi pinansin. Kung hindi man, ang epekto ng O_TRUNC ay hindi natukoy. (Sa maraming bersyon ng Linux ito ay hindi papansinin; sa iba pang mga bersyon, ito ay babalik ng isang error.)

O_APPEND

Ang file ay binuksan sa append mode. Bago ang bawat sumulat , ang pointer ng file ay nakaposisyon sa dulo ng file, na parang may lseek . Ang O_APPEND ay maaaring humantong sa masira na mga file sa mga sistema ng file ng NFS kung higit sa isang proseso ang nagdadagdag ng data sa isang file nang sabay-sabay. Ito ay dahil hindi sinusuportahan ng NFS ang appending sa isang file, kaya ang kernel ng kliyente ay dapat gayahin ito, na hindi maaaring gawin nang walang kondisyon ng lahi.

O_NONBLOCK o O_NDELAY

Kung posible, mabubuksan ang file sa non-blocking mode. Walang alinman sa bukas o anumang kasunod na operasyon sa file descriptor na ibabalik ay magdudulot ng paghihintay sa proseso ng pagtawag. Para sa paghawak ng mga FIFO (pinangalanang mga tubo), tingnan din ang fifo (4). Ang mode na ito ay hindi kailangang magkaroon ng anumang epekto sa mga file maliban sa FIFOs.

O_SYNC

Ang file ay binuksan para sa kasabay I / O. Anumang sumulat s sa resultang file descriptor ay hadlangan ang proseso ng pagtawag hanggang ang data ay pisikal na nakasulat sa pinagbabatayan ng hardware. Tingnan ang MGA RESTRICTIONS sa ibaba, bagaman.

O_NOFOLLOW

Kung ang pathname ay isang symbolic na link, ang bukas ay nabigo. Ito ay isang extension ng FreeBSD, na idinagdag sa Linux sa bersyon 2.1.126. Ang mga simbolikong link sa mga naunang bahagi ng pathname ay susundan pa rin. Ang mga header mula sa glibc 2.0.100 at sa paglaon ay nagsasama ng isang kahulugan ng bandila na ito; Ang mga kernel bago 2.1.126 ay huwag pansinin ito kung ginamit .

O_DIRECTORY

Kung ang pathname ay hindi isang direktoryo, maging sanhi ng bukas na mabibigo. Ang bandila na ito ay partikular sa Linux, at idinagdag sa kernel version 2.1.126, upang maiwasan ang mga problema sa pagtanggi sa serbisyo kung ang opendir (3) ay tinatawag sa isang FIFO o tape device, ngunit hindi dapat gamitin sa labas ng pagpapatupad ng opendir .

O_DIRECT

Subukang bawasan ang mga epekto ng cache ng I / O patungo at mula sa file na ito. Sa pangkalahatan ito ay magpapahina sa pagganap, ngunit ito ay kapaki-pakinabang sa mga espesyal na sitwasyon, tulad ng kapag ang mga application ay gumawa ng kanilang sariling caching. Ang file I / O ay direktang ginagawa sa / mula sa mga buffer ng espasyo ng gumagamit. Ang I / O ay kasabay, ibig sabihin, sa pagkumpleto ng nabasa (2) o sumulat (2) na tawag sa sistema, ang data ay garantisadong naipasa. Ang mga sukat ng paglipat, at ang pag-align ng buffer ng gumagamit at ang offset ng file ay dapat na ang lahat ng mga multiple ng lohikal na laki ng block ng system file.
Ang bandilang ito ay sinusuportahan sa isang bilang ng mga sistemang tulad ng Unix; Ang suporta ay idinagdag sa ilalim ng Linux sa kernel version 2.4.10.
Ang katulad na interface ng semantically para sa mga bloke na aparato ay inilarawan sa raw (8).

O_ASYNC

Gumawa ng isang senyas (SIGIO bilang default, ngunit ito ay maaaring mabago sa pamamagitan ng fcntl (2)) kapag ang input o output ay nagiging posible sa file descriptor na ito. Ang tampok na ito ay magagamit lamang para sa mga terminal, palsipikado-terminal, at mga socket. Tingnan ang fcntl (2) para sa mga karagdagang detalye.

O_LARGEFILE

Sa mga 32-bit na sistema na sumusuporta sa Malaking File System, payagan ang mga file na ang laki ay hindi maaaring katawanin sa 31 bits na mabubuksan.

Ang ilan sa mga opsyonal na mga flag ay maaaring mabago gamit ang fcntl pagkatapos mabuksan ang file.

Tinutukoy ng mode ng argument ang mga pahintulot na gagamitin kung may bagong file na nilikha. Ito ay binago ng umask ng proseso sa karaniwang paraan: ang mga pahintulot ng nilikha na file ay (mode & ~ umask) . Tandaan na ang mode na ito ay nalalapat lamang sa mga access sa hinaharap ng bagong nilikha na file; ang bukas na tawag na lumilikha ng read-only na file ay maaring ibalik ng isang read / write file descriptor.

Ang mga sumusunod na symbolic constants ay ibinigay para sa mode :

S_IRWXU

00700 user (may-ari ng file) ay nagbasa, nagsusulat at nagpapatupad ng pahintulot

S_IRUSR (S_IREAD)

Binasa ng user na 00400 ang pahintulot

S_IWUSR (S_IWRITE)

00200 user ay sumulat ng pahintulot

S_IXUSR (S_IEXEC)

Pinatupad ng 00100 ang pagpapatunay ng user

S_IRWXG

00070 pangkat ay nagbasa, sumulat at magsagawa ng pahintulot

S_IRGRP

Binasa ng pangkat na 00040 ang pahintulot

S_IWGRP

Isinulat ng pahintulot ang 00020 group

S_IXGRP

Execute permit ang 00010 group

S_IRWXO

00007 iba pa ang bumasa, sumulat at nagpapatupad ng pahintulot

S_IROTH

00004 iba pa ang nagbasa ng pahintulot

S_IWOTH

00002 ang iba ay sumulat ng pahintulot

S_IXOTH

00001 iba pa ang nagpapataw ng pahintulot

mode ay dapat na tinukoy kapag O_CREAT ay nasa flag , at hindi pinansin kung hindi man.

creat ay katumbas ng bukas na may mga flag na katumbas ng O_CREAT | O_WRONLY | O_TRUNC .

Ibalik ang VALUE

bukas at creat ibalik ang bagong file descriptor, o -1 kung naganap ang isang error (sa kaso, errno ay nakatakda naaangkop). Tandaan na ang bukas ay maaaring magbukas ng mga espesyal na file ng device, ngunit hindi ito makalikha ng creat - gamitin ang mknod (2) sa halip.

Sa mga sistema ng file ng NFS na pinapagana ang pagma-map ng UID, maaaring magbukas ang isang file descriptor ngunit hal basahin (2) ang mga kahilingan ay tinanggihan ng EACCES . Ito ay dahil ang kliyente ay gumaganap bukas sa pamamagitan ng pagsuri sa mga pahintulot, ngunit ang pagma-map ng UID ay ginagawa ng server kapag binasa at isulat ang mga kahilingan.

Kung ang bagong file ay nilikha, ang mga patlang ng oras, ctime, mtime nito ay nakatakda sa kasalukuyang oras, at sa gayon ay ang mga patlang ng ctime at mtime ng direktoryo ng magulang. Kung hindi, kung ang file ay nabago dahil sa bandila ng O_TRUNC, ang mga patlang ng ctime at mtime ay nakatakda sa kasalukuyang oras.

Mga Mali

EEXIST

Ang pathname ay umiiral na at ginamit ang O_CREAT at O_EXCL .

EISDIR

Ang pathname ay tumutukoy sa isang direktoryo at ang hiniling na pag-access ay kasangkot sa pagsulat (iyon ay, O_WRONLY o O_RDWR ay nakatakda).

EACCES

Ang hiniling na pag-access sa file ay hindi pinapayagan, o ang isa sa mga direktoryo sa pathname ay hindi pinapayagan ang paghahanap (execute) pahintulot, o ang file ay hindi pa umiiral at isulat ang access sa direktoryo ng magulang ay hindi pinapayagan.

ENAMETOOLONG

Masyadong mahaba ang pathname .

ENOENT

Ang O_CREAT ay hindi nakatakda at ang pinangalang file ay hindi umiiral. O, ang isang bahagi ng direktoryo sa pathname ay hindi umiiral o isang nakabitin na simbolikong link.

ENOTDIR

Ang isang bahagi na ginamit bilang isang direktoryo sa pathname ay hindi, sa katunayan, isang direktoryo, o O_DIRECTORY ay tinukoy at pathname ay hindi isang direktoryo.

ENXIO

O_NONBLOCK | Ang O_WRONLY ay nakatakda, ang pinangalanan na file ay isang FIFO at walang proseso ang file na bukas para sa pagbabasa. O kaya, ang file ay isang espesyal na file ng aparato at walang naaangkop na aparato.

ENODEV

Ang pathname ay tumutukoy sa isang espesyal na file ng aparato at walang naaangkop na aparato. (Ito ay isang Linux kernel bug - sa ganitong sitwasyon ENXIO ay dapat ibalik.)

EROFS

Ang pathname ay tumutukoy sa isang file sa isang read-only filesystem at isulat ang access ay hiniling.

ETXTBSY

Ang pathname ay tumutukoy sa isang executable na imahe na kasalukuyang isinasagawa at isulat ang access ay hiniling.

EFAULT

pathname points sa labas ng iyong naa-access na espasyo ng address.

ELOOP

Napakaraming simbolikong mga link ang nakatagpo sa paglutas ng pathname , o O_NOFOLLOW ay tinukoy ngunit pathname ay isang symbolic link.

ENOSPC

Ang pathname ay dapat malikha ngunit ang aparato na naglalaman ng pathname ay walang silid para sa bagong file.

ENOMEM

Hindi sapat ang kernel memory.

EMFILE

Ang proseso ay mayroon nang pinakamataas na bilang ng mga file na bukas.

ENFILE

Naabot na ang limitasyon sa kabuuang bilang ng mga file sa system.

Sumasang-ayon ka

SVr4, SVID, POSIX, X / OPEN, BSD 4.3 Ang O_NOFOLLOW at O_DIRECTORY flags ay Linux -specific. Ang isa ay maaaring may upang tukuyin ang _GNU_SOURCE macro upang makuha ang kanilang mga kahulugan.

Mga paghihigpit

Mayroong maraming mga infelicities sa protocol na pinagbabatayan ng NFS, na nakakaapekto sa iba pang O_SYNC at O_NDELAY .

Ang POSIX ay nagbibigay ng tatlong iba't ibang mga variant ng naka-synchronize na I / O, na tumutugma sa mga flag na O_SYNC , O_DSYNC at O_RSYNC . Sa kasalukuyan (2.1.130) ang mga ito ay lahat magkasingkahulugan sa ilalim ng Linux.