Sinau Linux Command Open

Sinopsis

#include << 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 buka (const char * pathname , int flags ); int buka (const char * pathname , flags flag int , mode_t ); int creat (const char * pathname , mode_t );

Gambaran

Sabanjure lulus sistem panggilan linux digunakake kanggo ngowahi jeneng path menyang deskriptor file (integer cilik, non-negatif sing dienggo ing I / O minangka maca , nulis , lan liya-liyane). Nalika telpon sukses, deskripsi file sing bakal bali dadi deskriptor file sing paling ora mbukak kanggo proses kasebut. Panggilan iki nggawe file mbukak anyar, ora dituduhake karo proses liyane. (Nanging file sing dienggo bareng mbukak bakal muncul liwat telpon garpu (2).) Deskriptor file anyar bakal tetep mbukak antarane fungsi exec (ndeleng fcntl (2)). File sing diimbangi diset menyang awal berkas.

Panji parameter minangka salah siji saka O_RDONLY , O_WRONLY utawa O_RDWR sing nyuwun mbukak file sing wis diwaca, mung-nulis utawa maca / nulis, dicithak, bitwise- utawa 'd karo nol utawa luwih saka:

O_CREAT

Yen file ora ana bakal digawe. Pemilik (ID pangguna) berkas disetel dadi ID panganggo sing efektif ing proses kasebut. Pamilik grup (ID klompok) disetel salah siji menyang klompok ID sing efektif ing proses utawa ID grup direktori induk (gumantung saka tipe file sistem lan opsi gunung, lan mode direktori induk, pirsani, contone, gunung opsi bsdgroups lan sysvgroups saka filesystem ext2, kaya sing dijelasake ing mount (8)).

O_EXCL

Nalika digunakake nganggo O_CREAT , yen file kasebut wis ana kesalahane lan mbukak bakal gagal. Ing konteks iki, ana pranala simbolis, ora ana papan ing ngendi. O_EXCL rusak ing sistem berkas NFS , program sing gumantung ing tugas ngunci kuwi bakal ngandhut kondisi balapan. Solusi kanggo nglakoni kunci ngunci file atom nggunakake lockfile yaiku nggawe file unik ing fs sing padha (misale, nggabungake hostname lan pid), gunakake link (2) kanggo nggawe link ke lockfile. Yen link () bali 0, kunci sukses. Yen ora, gunakake stat (2) ing file sing unik kanggo mriksa manawa jumlah link kasebut tambah nganti 2, lan kunci uga sukses.

O_NOCTTY

Yen pathname nuduhake piranti terminal --- ndeleng tty (4) --- ora bakal dadi terminal ngontrol proses sanajan proses ora duwe.

O_TRUNC

Yen file wis ana lan file biasa lan mode mbukak ngidini nulis (ie, O_RDWR utawa O_WRONLY) bakal dipotong dadi dawa 0. Yen file iku file piranti FIFO utawa terminal, bendera O_TRUNC diabaikan. Yen ora, efek O_TRUNC ora ditemokake. (Ing akeh versi Linux bakal diabaikan, ing versi liya, bakal ngasilake kesalahan.)

O_APPEND

Berkas iki dibukak ing mode append. Sadurunge saben nulis , pointer file dipanggonke ing mburi file, kaya karo maca . O_APPEND bisa nimbulaké file rusak ing sistem berkas NFS manawa luwih saka siji proses nambah data menyang file bebarengan. Iki amarga NFS ora ndhukung appending menyang file, supaya kernel klien kudu ndeteksi, sing ora bisa dilakoni tanpa kondisi balapan.

O_NONBLOCK utawa O_NDELAY

Yen bisa, file kasebut kabuka ing mode non-blocking. Ora ana sing mbukak utawa ora ana operasi ing sajrone file deskriptor sing bakal bali bakal nimbulake proses panggilan kasebut. Kanggo penanganan FIFO (dijenengi pipa), pirsani fifo (4). Mode iki mbutuhake efek apa wae ing file liya saka FIFO.

O_SYNC

File dibukak kanggo sinkron I / O. Saben sulis ing deskriptor file kasebut bakal mblokir proses pemanggilan nganti data wis ditulis sacara fisik marang hardware sing nduwe dhasar. Waca RESTRICTIONS ing ngisor iki, sanadyan.

O_NOFOLLOW

Yen pathname minangka pranala simbolis, banjur mbukak gagal. Iki minangka ekstensi FreeBSD, sing ditambahake menyang Linux versi 2.1.126. Pranala simbolis ing komponen sadurungé pathname isih bakal dilacak. Pangurus saka glibc 2.0.100 lan mengko kalebu definisi flag iki; kernel sadurunge 2.1.126 bakal nglirwakake kasebut yen digunakake .

O_DIRECTORY

Yen jeneng path ora direktori, nimbulake mbukak kanggo gagal. Gendéra iki khusus kanggo Linux, lan ditambahaké ing versi kernel 2.1.126, supaya masalah ora bisa dilarang nalika opendir (3) diarani FIFO utawa piranti tape, nanging ora kena dipigunakaké ing njaba implementasi opendir .

ODIRECT

Coba nyilikake efek cache saka I / O menyang lan saka berkas iki. Umumé iki bakal ngurangi kinerja, nanging migunani ing kahanan khusus, kayata nalika aplikasi nggawe caching dhewe. File I / O rampung langsung menyang / saka panyimpenan ruang pangguna. I / O sinkron, yaiku, nalika rampung maca (2) utawa nulis (2) sistem panggilan, data dijamin wis ditransfer. Ukuran transfer, lan panyimpenan buffer pangguna lan file sing diimbangi kudu kabeh dadi kelipatan ukuran blok logis sistem berkas.
Gendéra iki didhukung ing sawetara sistem kaya Unix; dhukungan ditambahake ing Linux ing versi kernel 2.4.10.
Antarmuka sing padha karo semantik kanggo piranti blok diterangake ing mentahan (8).

O_ASYNC

Generate sinyal (SIGIO kanthi standar, nanging iki bisa diowahi liwat fcntl (2)) nalika input utawa output bisa dadi file deskriptor. Fitur iki mung kasedhiya kanggo terminal, pseudo-terminal, lan socket. Waca fcntl (2) kanggo katrangan luwih rinci.

O_LARGEFILE

Ing sistem 32-bit sing ndhukung Sistem Berkas Gedhe, ngidini file ukurane ora bisa dituduhake ing 31 bit supaya bisa dibukak.

Sawetara bendera opsional bisa diganti nganggo fcntl sawise file wis dibuka.

Mode argument nemtokake ijin kanggo nggunakake yen file anyar digawe. Iki diowahi dening proses umask kanthi cara biasa: ijin berkas sing digawe yaiku (mode & umask) . Elinga yen mode iki mung ditrapake kanggo akses mangsa saka berkas sing lagi wae digawe; Panggilan mbukak sing nggawe file sing diwaca mung bisa ngasilake descriptor file maca / tulis.

Konstanta simbol ing ngisor iki kasedhiya kanggo mode :

S_IRWXU

00700 panganggo (pemilik file) wis maca, nulis, lan nglakok ijin

S_IRUSR (S_IREAD)

00400 pengguna wis maca ijin

SIRIWARA (S_IWRITE)

Anggota 00200 wis ijin nulis

S_IXUSR (S_IEXEC)

User 00100 wis ngeksekusi ijin

S_IRWXG

00070 grup wis maca, nulis, lan nglakok ijin

S_IRGRP

Grup iki wis maca ijin

Angger

Grup iki duwe ijin nulis

S_IXGRP

Grup iki nduweni idin eksekusi 00010

S_IRWXO

00007 liyane wis maca, nulis, lan nglakok ijin

S_IROTH

00004 liyane wis maca ijin

Geguritan

00002 liyane duwe ijin nulis

Panji

00001 liyane duwe ijin hajar

mode kudu ditemtokake nalika O_CREAT ana ing panji , lan ora dianggep liya.

creat is equivalent to open with flags equal to O_CREAT | O_WRONLY | O_TRUNC .

RETURN VALUE

mbukak lan nggawe bali deskriptor file anyar, utawa -1 yen ana kesalahan (ing kasus iki, errno disetel kanthi tepat). Elinga yen mbukak bisa mbukak file khusus piranti, nanging creat ora iso nggawe - gunakake mknod (2) wae.

Ing sistem berkas NFS kanthi pemetaan UID aktif, mbukak bisa ngasilake deskriptor file nanging eg maca (2) panjaluk ora ditolak karo EACCES . Iki amarga klien nindakake mbukak kanthi mriksa ijin, nanging pemetaan UID ditindakake dening server kasebut nalika maca lan nulis panjaluk.

Yen file anyar digawe, lapangan atine, ctime, mtime disetel kanggo wektu saiki, lan dadi kolom ctime lan mtime saka direktori induk. Yen ora, manawa file kasebut diowahi amarga saka bendera O_TRUNC, kothak ctime lan mtime disetel kanggo wektu saiki.

Kasalahan

Ekspor

pathname wis ana lan O_CREAT lan O_EXCL digunakake.

EISDIR

pathname ngarujuk menyang direktori lan akses dijaluk nulis sing melu (yaiku, O_WRONLY utawa O_RDWR wis disetel).

EACCES

Akses sing dituntut kanggo file ora diidini, utawa salah siji direktori ing pathname ora ngidini ijin (ngeksekusi), utawa file durung ana lan nulis akses menyang direktori induk ora diijini.

ENAMETOOLONG

pathname banget dawa.

ENTER

O_CREAT ora disetel lan file sing dijenengake ora ana. Utawa, komponèn direktori ing pathname ora ana utawa minangka pranala simbolis sing nempel.

ENOTDIR

Komponen sing digunakake minangka direktori ing pathname ora, ing kasunyatan, direktori, utawa O_DIRECTORY sing ditemtokake lan pathname ora minangka direktori.

ENXIO

O_NONBLOCK | O_WRONLY wis disetel, file sing jenenge dadi FIFO lan ora ana proses mbukak file kanggo maca. Utawa, file kasebut minangka file khusus piranti lan ora ana piranti sing cocog.

ENODEV

pathname nuduhake file khusus piranti lan ora ana piranti sing cocog. (Iki minangka bug kernel Linux - ing kahanan ENXIO iki kudu dibaleni.)

EROFS

pathname nuduhake file ing sistem berkas sing wis diwaca lan nulis akses dijaluk.

ETXTBSY

pathname nuduhake gambar eksekusi sing saiki dieksekusi lan akses nulis dijaluk.

EFAULT

pathname nampilake njaba spasi alamat sampeyan.

ELOOP

Ana akeh pranala simbolik sing ditemokake ing pathname , utawa O_NOFOLLOW kasebut nanging pathname minangka pranala simbolis.

ENOSPC

pathname bakal digawe nanging piranti sing ngandhut pathname ora ana ruang kanggo berkas anyar.

ENOMEM

Kernel memori ora cukup.

EMCOLE

Proses kasebut wis nduweni jumlah maksimum file sing mbukak.

ENFILE

Watesan jumlah total file sing mbukak ing sistem wis tekan.

Konstruktif kanggo

SVr4, SVID, POSIX, X / OPEN, BSD 4.3 Panji- panji O_NOFOLLOW lan O_DIRECTORY iku khusus kanggo Linux . Salah sijine kudu nemtokake makro _GNU_SOURCE kanggo nduwe definisi.

Watesan

Ana akeh infelicities ing protokol sing ndadekake NFS, mengaruhi liyane O_SYNC lan O_NDELAY .

POSIX nyedhiyakake telung variasi I / O sing disinkronake, sing cocog karo panji O_SYNC , O_DSYNC lan O_RSYNC . Saiki (2.1.130) iki kabeh sinonim karo Linux.