Sinopsis
#include << HREF = "fail: /usr/include/sys/types.h"> sys / types.h> #include << A HREF = "file: /usr/include/sys/stat.h"> sys / stat.h> #include << A HREF = "fail: /usr/include/fcntl.h"> fcntl.h> int buka (const char * pathname , flags int ); int buka (const char * pathname, bendera int , mod mode_t ); int creat (const char * nama laluan , mod mode_t );Penerangan
Perintah linux panggilan terbuka () sistem digunakan untuk menukar nama laluan menjadi deskriptor fail (integer yang kecil, tidak negatif untuk digunakan dalam I / O berikutnya seperti membaca , menulis , dan sebagainya). Apabila panggilan berjaya, deskriptor fail yang dikembalikan akan menjadi deskriptor fail paling rendah yang tidak dibuka untuk proses ini. Panggilan ini mewujudkan fail terbuka baru, tidak dikongsi dengan sebarang proses lain. (Tetapi fail terbuka yang dikongsi mungkin timbul melalui panggilan sistem fork (2).) Penjelasan fail baru ditetapkan untuk kekal terbuka merentas fungsi pelaksanaan (lihat fcntl (2)). Offset fail ditetapkan ke permulaan fail.
Bendera parameter adalah salah satu daripada O_RDONLY , O_WRONLY atau O_RDWR yang meminta pembukaan fail hanya baca, tulis sahaja atau baca / tulis, bitwise- atau 'd dengan sifar atau lebih daripada yang berikut:
O_CREAT
Jika fail tidak wujud, ia akan diwujudkan. Pemilik (ID pengguna) fail disetkan kepada ID pengguna yang berkesan dalam proses tersebut. Pemilikan kumpulan (ID kumpulan) ditetapkan sama dengan ID kumpulan proses yang efektif atau kepada ID kumpulan direktori induk (bergantung pada jenis sistem fail dan pilihan gunung, dan mod direktori induk, lihat, contohnya, pemasangan pilihan bsdgroups dan sysvgroups dari sistem fail ext2, seperti yang diterangkan dalam mount (8)).
O_EXCL
Apabila digunakan dengan O_CREAT , jika fail sudah wujud, ia adalah ralat dan terbuka akan gagal. Dalam konteks ini, terdapat pautan simbolik, tidak kira di mana titiknya. O_EXCL dipecahkan pada sistem fail NFS , program yang bergantung kepadanya untuk melaksanakan tugas mengunci akan mengandungi keadaan perlumbaan. Penyelesaian untuk melakukan penguncian fail atom dengan menggunakan lockfile adalah untuk membuat fail unik pada fs yang sama (mis., Memasukkan nama hos dan pid), gunakan pautan (2) untuk membuat pautan ke fail lock. Jika pautan () mengembalikan 0, kunci berjaya. Jika tidak, gunakan stat (2) pada fail yang unik untuk memeriksa sama ada kiraan pautannya telah meningkat kepada 2, yang mana kunci juga berjaya.
O_NOCTTY
Jika nama laluan merujuk kepada peranti terminal --- lihat tty (4) --- ia tidak akan menjadi terminal pengendalian proses walaupun proses itu tidak mempunyai satu.
O_TRUNC
Jika fail tersebut sudah wujud dan merupakan fail biasa dan mod terbuka membolehkan penulisan (iaitu, O_RDWR atau O_WRONLY) ia akan dipangkas hingga panjang 0. Jika fail itu adalah fail peranti FIFO atau terminal, bendera O_TRUNC diabaikan. Jika tidak, kesan O_TRUNC tidak ditentukan. (Pada banyak versi Linux ia akan diabaikan, pada versi lain, ia akan mengembalikan ralat.)
O_APPEND
Fail dibuka dalam mod tambah. Sebelum menulis , penuding fail diletakkan pada akhir fail, seolah-olah dengan lseek . O_APPEND boleh menyebabkan fail rusak pada sistem fail NFS jika lebih daripada satu proses menambah data ke fail sekaligus. Ini kerana NFS tidak menyokong menambah fail, jadi kernel pelanggan perlu mensimulasikannya, yang tidak boleh dilakukan tanpa keadaan perlumbaan.
O_NONBLOCK atau O_NDELAY
Apabila mungkin, fail dibuka dalam mod tidak menyekat. Baik operasi terbuka atau sebarang operasi selanjutnya pada deskriptor fail yang dikembalikan akan menyebabkan proses panggilan menunggu. Untuk pengendalian FIFOs (bernama paip), lihat juga fifo (4). Mod ini tidak mempunyai kesan ke atas fail selain FIFO.
O_SYNC
Fail dibuka untuk sinkron I / O. Apa - apa yang ditulis pada deskriptor fail yang terhasil akan menghalang proses panggilan sehingga data telah ditulis secara fizikal ke perkakasan yang mendasari. Lihat RESTRIKTIONS di bawah, walaupun.
O_NOFOLLOW
Jika nama laluan adalah pautan simbolik, maka terbuka gagal. Ini adalah sambungan FreeBSD, yang telah ditambah ke Linux dalam versi 2.1.126. Pautan simbolik dalam komponen awal nama laluan masih akan diikuti. Tajuk dari glibc 2.0.100 dan kemudian termasuk definisi bendera ini; kernel sebelum 2.1.126 akan mengabaikannya jika digunakan .
O_DIRECTORY
Jika nama laluan bukan direktori, menyebabkan terbuka untuk gagal. Bendera ini adalah khusus Linux, dan ditambah dalam versi kernel 2.1.126, untuk mengelakkan masalah penafian jika opendir (3) dipanggil pada FIFO atau peranti pita, tetapi tidak boleh digunakan di luar pelaksanaan opendir .
O_DIRECT
Cuba untuk meminimumkan kesan cache dari I / O ke dan dari fail ini. Umumnya ini akan merendahkan prestasi, tetapi berguna dalam situasi khusus, seperti ketika aplikasi melakukan caching sendiri. Fail I / O dilakukan secara langsung ke / dari penampan ruang pengguna. I / O adalah segerak, iaitu, setelah selesai bacaan (2) atau menulis (2) panggilan sistem, data dijamin telah dipindahkan. Saiz perpindahan, dan penyesuaian penampan pengguna dan fail offset mesti semua kelipatan saiz blok logik sistem fail.
Bendera ini disokong pada beberapa sistem seperti Unix; sokongan telah ditambah di bawah Linux dalam versi kernel 2.4.10.
Antaramuka semantik yang serupa untuk peranti blok diterangkan dalam mentah (8).
O_ASYNC
Menjana isyarat (SIGIO secara lalai, tetapi ini boleh diubah melalui fcntl (2)) apabila input atau output menjadi mungkin pada deskriptor fail ini. Ciri ini hanya tersedia untuk terminal, pseudo-terminal, dan soket. Lihat fcntl (2) untuk maklumat lanjut.
O_LARGEFILE
Pada sistem 32-bit yang menyokong Sistem Fail Besar, biarkan fail yang saiznya tidak boleh diwakili dalam 31 bit yang akan dibuka.
Beberapa bendera pilihan ini boleh diubah menggunakan fcntl selepas fail dibuka.
Mod argumen menentukan keizinan untuk digunakan sekiranya fail baru dibuat. Ia diubah suai oleh umask proses dengan cara biasa: keizinan fail yang dibuat adalah (mod & ~ umask) . Ambil perhatian bahawa mod ini hanya terpakai untuk akses masa depan fail yang baru dibuat; panggilan terbuka yang mencipta fail baca-hanya boleh mengembalikan deskriptor fail baca / tulis.
Pemalar simbolik berikut disediakan untuk mod :
S_IRWXU
00700 pengguna (pemilik fail) telah membaca, menulis dan melaksanakan kebenaran
S_IRUSR (S_IREAD)
00400 pengguna telah membaca kebenaran
S_IWUSR (S_IWRITE)
00200 pengguna mempunyai kebenaran menulis
S_IXUSR (S_IEXEC)
00100 pengguna telah melaksanakan kebenaran
S_IRWXG
Kumpulan 00070 telah membaca, menulis dan melaksanakan kebenaran
S_IRGRP
Kumpulan 00040 telah membaca kebenaran
S_IWGRP
Kumpulan 00020 mempunyai izin menulis
S_IXGRP
Kumpulan 00010 telah melaksanakan izin
S_IRWXO
00007 yang lain telah membaca, menulis dan melaksanakan kebenaran
S_IROTH
00004 yang lain telah membaca kebenaran
S_IWOTH
00002 yang lain mempunyai kebenaran menulis
S_IXOTH
00001 yang lain mempunyai kebenaran melaksanakan
mod mesti ditentukan apabila O_CREAT berada di bendera , dan diabaikan sebaliknya.
creat setara dengan terbuka dengan bendera sama dengan O_CREAT | O_WRONLY | O_TRUNC .
NILAI NILAI
buka dan creat kembalikan deskriptor fail baru, atau -1 jika ralat berlaku (dalam hal ini, errno ditetapkan dengan tepat). Ambil perhatian bahawa terbuka boleh membuka fail khas peranti, tetapi creat tidak dapat membuatnya - gunakan mknod (2) sebaliknya.
Pada sistem fail NFS dengan pemetaan UID diaktifkan, terbuka boleh mengembalikan deskriptor fail tetapi misalnya baca (2) permintaan ditolak dengan EACCES . Ini kerana pelanggan melakukan terbuka dengan memeriksa kebenaran, tetapi pemetaan UID dilakukan oleh pelayan apabila membaca dan menulis permintaan.
Jika fail baru dibuat, medan atime, ctime, mtime ditetapkan pada masa kini, dan begitu juga medan ctime dan mtime direktori induk. Jika tidak, jika fail diubahsuai kerana bendera O_TRUNC, medan ctime dan mtime ditetapkan pada masa semasa.
Kesilapan
EEXIST
Nama laluan sudah wujud dan O_CREAT dan O_EXCL telah digunakan.
EISDIR
Nama laluan merujuk kepada direktori dan akses yang diminta melibatkan penulisan (iaitu, O_WRONLY atau O_RDWR ditetapkan).
EACCES
Akses yang diminta ke fail tidak dibenarkan, atau salah satu direktori dalam nama laluan tidak membenarkan izin carian (jalankan), atau fail belum ada dan menulis akses ke direktori induk tidak dibenarkan.
ENAMETOOLONG
Nama laluan terlalu panjang.
ENOENT
O_CREAT tidak ditetapkan dan fail bernama tidak wujud. Atau, komponen direktori dalam nama laluan tidak ada atau pautan simbol yang menggantung.
ENOTDIR
Komponen yang digunakan sebagai direktori dalam nama laluan tidak, sesungguhnya, direktori, atau O_DIRECTORY telah ditentukan dan pathname bukan direktori.
ENXIO
O_NONBLOCK | O_WRONLY ditetapkan, fail bernama adalah FIFO dan tiada proses yang membuka fail untuk membaca. Atau, fail itu adalah fail khas peranti dan tiada peranti yang bersesuaian.
ENODEV
Nama laluan merujuk kepada fail khas peranti dan tiada peranti yang bersesuaian. (Ini adalah bug kernel Linux - dalam keadaan ini ENXIO mesti dikembalikan.)
EROFS
Nama laluan merujuk kepada fail pada sistem fail baca sahaja dan akses akses diminta.
ETXTBSY
Nama laluan merujuk kepada imej yang boleh laku yang sedang dilaksanakan dan akses tulis diminta.
EFAULT
laluan laluan di luar ruang alamat anda yang boleh diakses.
ELOOP
Terlalu banyak pautan simbolik yang ditemui dalam menyelesaikan nama laluan , atau O_NOFOLLOW telah ditentukan tetapi nama laluan adalah pautan simbolik.
ENOSPC
Nama laluan dibuat tetapi peranti yang mengandungi nama laluan tidak mempunyai ruang untuk fail baru.
ENOMEM
Memori kernel tidak mencukupi tersedia.
EMFILE
Proses sudah mempunyai bilangan maksimum fail terbuka.
ENFILE
Had jumlah keseluruhan fail yang dibuka pada sistem telah dicapai.
Bertepatan dengan
SVr4, SVID, POSIX, X / OPEN, BSD 4.3 Bendera O_NOFOLLOW dan O_DIRECTORY adalah khusus Linux . Kita mungkin perlu menentukan makro _GNU_SOURCE untuk mendapatkan takrifan mereka.
Sekatan
Terdapat banyak kecacatan dalam protokol yang mendasari NFS, yang mempengaruhi antara lain O_SYNC dan O_NDELAY .
POSIX menyediakan tiga varian berbeza I / O diselaraskan, sepadan dengan bendera O_SYNC , O_DSYNC dan O_RSYNC . Pada masa ini (2.1.130) ini semua sinonim di bawah Linux.