Ringkasan
#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 terbuka (const char * pathname , int flags ); int open (const char * pathname , int flags , mode mode_t ); int creat (const char * pathname , mode mode_t );Deskripsi
Perintah open () system call linux digunakan untuk mengubah pathname menjadi file descriptor (bilangan bulat kecil, non-negatif untuk digunakan pada I / O berikutnya seperti membaca , menulis , dll.). Ketika panggilan berhasil, deskriptor file kembali akan menjadi file deskriptor terendah saat ini tidak terbuka untuk proses. Panggilan ini membuat file terbuka baru, tidak dibagikan dengan proses lainnya. (Tapi file terbuka bersama mungkin timbul melalui fork (2) system call.) File deskriptor baru diatur untuk tetap terbuka di seluruh fungsi exec (lihat fcntl (2)). Offset file diatur ke awal file.
Flag parameter adalah salah satu dari O_RDONLY , O_WRONLY atau O_RDWR yang meminta membuka file hanya-baca, hanya-menulis atau membaca / menulis, masing-masing, bitwise- atau 'd dengan nol atau lebih dari yang berikut:
O_CREAT
Jika file tidak ada maka akan dibuat. Pemilik (ID pengguna) dari file diatur ke ID pengguna yang efektif dari proses. Kepemilikan grup (ID grup) diatur ke ID grup yang efektif dari proses atau ke ID grup dari direktori induk (tergantung pada tipe filesystem dan opsi mount, dan mode direktori induk, lihat, misalnya, mount opsi bsdgroup dan sysvgroup dari filesystem ext2, seperti yang dijelaskan di mount (8)).
O_EXCL
Ketika digunakan dengan O_CREAT , jika file sudah ada itu adalah kesalahan dan terbuka akan gagal. Dalam konteks ini, ada hubungan simbolis, terlepas dari mana poinnya. O_EXCL rusak pada sistem file NFS , program yang mengandalkannya untuk melakukan tugas penguncian akan berisi kondisi balapan. Solusi untuk melakukan penguncian file atom menggunakan lockfile adalah untuk membuat file unik pada fs yang sama (misalnya, menggabungkan hostname dan pid), gunakan tautan (2) untuk membuat link ke lockfile. Jika tautan () mengembalikan 0, kunci berhasil. Jika tidak, gunakan stat (2) pada file unik untuk memeriksa apakah jumlah tautannya telah meningkat menjadi 2, dalam hal mana kunci juga berhasil.
O_NOCTTY
Jika pathname merujuk ke perangkat terminal --- lihat tty (4) --- itu tidak akan menjadi terminal pengontrol proses bahkan jika prosesnya tidak memilikinya.
O_TRUNC
Jika file sudah ada dan merupakan file biasa dan mode terbuka memungkinkan penulisan (mis., O_RDWR atau O_WRONLY), maka akan terpotong menjadi panjang 0. Jika file tersebut adalah file FIFO atau perangkat terminal, bendera O_TRUNC diabaikan. Jika tidak, efek O_TRUNC tidak ditentukan. (Pada banyak versi Linux, akan diabaikan; pada versi lain, ini akan mengembalikan kesalahan.)
O_APPEND
File dibuka dalam mode tambahan. Sebelum setiap menulis , penunjuk file diposisikan pada akhir file, seolah-olah dengan lseek . O_APPEND dapat menyebabkan file rusak pada sistem file NFS jika lebih dari satu proses menambahkan data ke file sekaligus. Ini karena NFS tidak mendukung menambahkan file, sehingga kernel klien harus mensimulasikannya, yang tidak dapat dilakukan tanpa syarat balapan.
O_NONBLOCK atau O_NDELAY
Jika memungkinkan, file dibuka dalam mode non-blocking. Baik operasi terbuka maupun operasi berikutnya pada deskriptor file yang dikembalikan akan menyebabkan proses panggilan untuk menunggu. Untuk penanganan FIFO (pipa bernama), lihat juga fifo (4). Mode ini tidak perlu berpengaruh pada file selain FIFO.
O_SYNC
File dibuka untuk I / O sinkron. Setiap write pada deskriptor file yang dihasilkan akan memblokir proses pemanggilan sampai data secara fisik ditulis ke perangkat keras yang mendasarinya. Lihat PEMBATASAN di bawah ini.
O_NOFOLLOW
Jika pathname adalah tautan simbolis, maka buka gagal. Ini adalah ekstensi FreeBSD, yang ditambahkan ke Linux dalam versi 2.1.126. Tautan simbolis di komponen sebelumnya dari pathname masih akan diikuti. Header dari glibc 2.0.100 dan kemudian menyertakan definisi dari bendera ini; kernel sebelum 2.1.126 akan mengabaikannya jika digunakan .
O_DIRECTORY
Jika pathname bukan direktori, menyebabkan open gagal. Bendera ini khusus untuk Linux, dan ditambahkan dalam versi kernel 2.1.126, untuk menghindari masalah penolakan-layanan jika opendir (3) dipanggil pada FIFO atau perangkat tape, tetapi tidak boleh digunakan di luar pelaksanaan opendir .
O_DIRECT
Cobalah untuk meminimalkan efek cache I / O ke dan dari file ini. Secara umum ini akan menurunkan kinerja, tetapi berguna dalam situasi khusus, seperti ketika aplikasi melakukan cache sendiri. File I / O dilakukan langsung ke / dari buffer ruang pengguna. I / O adalah sinkron, yaitu, pada penyelesaian panggilan membaca (2) atau menulis (2) sistem, data dijamin telah ditransfer. Ukuran transfer, dan penyelarasan buffer pengguna dan file offset semua harus kelipatan dari ukuran blok logis dari sistem file.
Bendera ini didukung pada sejumlah sistem mirip Unix; Dukungan ditambahkan di Linux dalam versi kernel 2.4.10.
Antarmuka semantis serupa untuk perangkat blok dideskripsikan secara mentah (8).
O_ASYNC
Hasilkan sinyal (SIGIO secara default, tetapi ini dapat diubah melalui fcntl (2)) ketika input atau output menjadi mungkin pada deskriptor file ini. Fitur ini hanya tersedia untuk terminal, pseudo-terminal, dan soket. Lihat fcntl (2) untuk detail lebih lanjut.
O_LARGEFILE
Pada sistem 32-bit yang mendukung Sistem File Besar, izinkan file yang ukurannya tidak dapat diwakili dalam 31 bit untuk dibuka.
Beberapa flag opsional ini dapat diubah menggunakan fcntl setelah file dibuka.
Mode argumen menentukan izin untuk digunakan jika file baru dibuat. Ini dimodifikasi oleh proses umask dengan cara yang biasa: izin dari file yang dibuat adalah (mode & ~ umask) . Perhatikan bahwa mode ini hanya berlaku untuk akses masa depan file yang baru dibuat; panggilan terbuka yang membuat file read-only mungkin mengembalikan deskriptor file baca / tulis.
Konstanta simbolis berikut disediakan untuk mode :
S_IRWXU
00700 pengguna (pemilik file) telah membaca, menulis, dan mengeksekusi izin
S_IRUSR (S_IREAD)
Pengguna 00400 telah membaca izin
S_IWUSR (S_IWRITE)
00200 pengguna memiliki izin menulis
S_IXUSR (S_IEXEC)
00100 pengguna telah mengeksekusi izin
S_IRWXG
00070 grup telah membaca, menulis, dan mengeksekusi izin
S_IRGRP
Grup 00040 telah membaca izin
S_IWGRP
00020 grup memiliki izin menulis
S_IXGRP
Kelompok 00010 telah mengeksekusi izin
S_IRWXO
00007 lainnya telah membaca, menulis, dan mengeksekusi izin
S_IROTH
00004 orang lain telah membaca izin
S_IWOTH
00002 orang lain memiliki izin menulis
S_IXOTH
00001 orang lain telah mengeksekusi izin
mode harus ditentukan ketika O_CREAT ada di bendera , dan diabaikan sebaliknya.
creat sama dengan membuka dengan bendera sama dengan O_CREAT | O_WRONLY | O_TRUNC .
KEMBALIKAN NILAI
buka dan buat kembalikan deskriptor file baru, atau -1 jika terjadi kesalahan (dalam hal ini, errno diatur dengan tepat). Perhatikan bahwa buka dapat membuka file khusus perangkat, tetapi creat tidak dapat membuatnya - gunakan mknod (2) sebagai gantinya.
Pada sistem file NFS dengan pemetaan UID diaktifkan, buka dapat mengembalikan deskriptor file tetapi misalnya permintaan baca (2) ditolak dengan EACCES . Ini karena klien melakukan operasi dengan memeriksa perizinan, tetapi pemetaan UID dilakukan oleh server setelah membaca dan menulis permintaan.
Jika file baru dibuat, atime, ctime, bidang mtime-nya diatur ke waktu saat ini, dan begitu juga bidang ctime dan mtime dari direktori induk. Jika tidak, jika file tersebut dimodifikasi karena bendera O_TRUNC, bidang ctime dan mtime-nya diatur ke waktu saat ini.
Kesalahan
EEXIST
pathname sudah ada dan O_CREAT dan O_EXCL digunakan.
EISDIR
pathname mengacu pada direktori dan akses yang diminta terlibat penulisan (yaitu, O_WRONLY atau O_RDWR diatur).
EACCES
Akses yang diminta ke file tidak diperbolehkan, atau salah satu direktori di pathname tidak mengizinkan izin pencarian (eksekusi), atau file belum ada dan akses tulis ke direktori induk tidak diizinkan.
ENAMETOOLONG
nama path terlalu panjang.
ENOENT
O_CREAT tidak disetel dan file yang dinamai tidak ada. Atau, komponen direktori di pathname tidak ada atau merupakan tautan simbolis yang menggantung.
ENOTDIR
Komponen yang digunakan sebagai direktori di pathname tidak, pada kenyataannya, sebuah direktori, atau O_DIRECTORY ditentukan dan pathname bukanlah direktori.
ENXIO
O_NONBLOCK | O_WRONLY diatur, file yang bernama adalah FIFO dan tidak ada proses yang membuka file untuk dibaca. Atau, file adalah file khusus perangkat dan tidak ada perangkat yang sesuai.
ENODEV
pathname mengacu pada file khusus perangkat dan tidak ada perangkat yang sesuai. (Ini adalah bug kernel Linux - dalam situasi ini ENXIO harus dikembalikan.)
EROFS
pathname mengacu pada file pada sistem file read-only dan akses tulis diminta.
ETXTBSY
pathname mengacu pada gambar yang dapat dijalankan yang saat ini sedang dieksekusi dan akses tulis diminta.
EFAULT
titik pathname di luar ruang alamat Anda yang dapat diakses.
ELOOP
Terlalu banyak tautan simbolik yang ditemukan dalam menyelesaikan pathname , atau O_NOFOLLOW ditentukan tetapi pathname adalah tautan simbolis.
ENOSPC
pathname harus dibuat tetapi perangkat yang mengandung pathname tidak memiliki ruang untuk file baru.
ENOMEM
Memori kernel tidak cukup tersedia.
EMFILE
Proses sudah memiliki jumlah file maksimum yang terbuka.
ENFILE
Batas jumlah total file yang dibuka pada sistem telah tercapai.
Sesuai dengan
SVr4, SVID, POSIX, X / OPEN, BSD 4.3 Flag O_NOFOLLOW dan O_DIRECTORY adalah Linux- spesifik. Seseorang mungkin harus mendefinisikan makro _GNU_SOURCE untuk mendapatkan definisinya.
Batasan
Ada banyak infelicities dalam protokol yang mendasari NFS, yang mempengaruhi antara lain O_SYNC dan O_NDELAY .
POSIX menyediakan untuk tiga varian yang berbeda dari I / O tersinkronisasi, sesuai dengan bendera O_SYNC , O_DSYNC dan O_RSYNC . Saat ini (2.1.130) ini semua identik di Linux.