Pelajari Perintah Linux Terbuka

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.