Ketahui Terbuka Perintah Linux

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.