Skip to main content

Buka Perintah Linux dan Perintah Unix

Beginilah cara meng-compile bahasa c di linux #belajar gcc (Juni 2025)

Beginilah cara meng-compile bahasa c di linux #belajar gcc (Juni 2025)
Anonim

Ringkasan

#include #include #include int open (const char * nama jalan , int bendera ); int open (const char * nama jalan , int bendera , mode_t mode ); int creat (const char * nama jalan , mode_t mode );

Deskripsi

ItuBuka() perintah system call linux digunakan untuk mengubah pathname menjadi file descriptor (bilangan bulat kecil, non-negatif untuk digunakan pada I / O berikutnya seperti Baca baca, 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. (Tetapi file terbuka bersama mungkin muncul melaluigarpu(2) panggilan sistem.) File deskriptor baru diatur untuk tetap terbuka di seluruh fungsi exec (lihatfcntl(2)). Offset file diatur ke awal file.

Parameter bendera adalah salah satunyaO_RDONLY, O_WRONLY atauO_RDWR yang meminta membuka file hanya-baca, hanya-menulis atau membaca / menulis, masing-masing, bitwise- atau 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 pilihan bsdgroups dan sysvgroup dari filesystem ext2, seperti yang dijelaskan dalammeningkat(8)).

O_EXCL

Saat digunakan denganO_CREAT, jika file sudah ada, itu adalah kesalahan danBuka 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 tautan ke lockfile. Jikalink() mengembalikan 0, kunci berhasil. Kalau 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 nama jalan mengacu pada perangkat terminal --- lihattty(4) --- itu tidak akan menjadi terminal pengendali proses bahkan jika proses tidak memilikinya.

O_TRUNC

Jika file sudah ada dan merupakan file biasa dan mode terbuka memungkinkan penulisan (yaitu, O_RDWR atau O_WRONLY), maka akan dipotong menjadi panjang 0. Jika file tersebut adalah file perangkat FIFO atau 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 masing-masingmenulis, file pointer diposisikan pada akhir file, seolah-olah denganlseek. 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 atauO_NDELAY

Jika memungkinkan, file dibuka dalam mode non-blocking. Bukan keduanyaBuka atau operasi berikutnya pada deskriptor file yang dikembalikan akan menyebabkan proses panggilan untuk menunggu. Untuk penanganan FIFO (pipa bernama), lihat jugafifo(4). Mode ini tidak perlu berpengaruh pada file selain FIFO.

O_SYNC

File dibuka untuk I / O sinkron. Apa sajamenuliss pada deskriptor file yang dihasilkan akan memblokir proses pemanggilan sampai data telah secara fisik ditulis ke perangkat keras yang mendasarinya. Lihat PEMBATASAN di bawah ini.

O_NOFOLLOW

Jika nama jalan adalah tautan simbolis, lalu 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 nama jalan bukan direktori, menyebabkan open gagal. Bendera ini khusus untuk Linux, dan ditambahkan dalam versi kernel 2.1.126, untuk menghindari masalah penolakan-layanan jikaopendir(3) dipanggil pada FIFO atau perangkat tape, tetapi tidak boleh digunakan di luar implementasiopendir.

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 sinkron, yaitu, pada saat penyelesaian Baca baca(2) ataumenulis(2) panggilan 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 dijelaskan dalammentah(8).

O_ASYNC

Hasilkan sinyal (SIGIO secara default, tetapi ini dapat diubah melaluifcntl(2)) ketika input atau output menjadi mungkin pada pendeskripsi file ini. Fitur ini hanya tersedia untuk terminal, pseudo-terminal, dan soket. Lihatfcntl(2) untuk keterangan 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 dari bendera opsional ini dapat diubah menggunakanfcntl setelah file dibuka.

Argumen mode menentukan izin untuk digunakan jika file baru dibuat. Itu dimodifikasi oleh proses ituumask 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; ituBukapanggilan 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 kapanO_CREAT ada di bendera , dan diabaikan sebaliknya.

creat setara denganBuka dengan bendera sama denganO_CREAT | O_WRONLY | O_TRUNC.

KEMBALIKAN NILAI

Buka dancreat kembalikan deskriptor file baru, atau -1 jika terjadi kesalahan (dalam hal ini, errno diatur dengan tepat). Perhatikan ituBuka dapat membuka file khusus perangkat, tetapicreat tidak dapat membuatnya - gunakanmknod(2) sebagai gantinya.

Pada sistem file NFS dengan pemetaan UID diaktifkan,Buka dapat mengembalikan deskriptor file, tetapi mis. Baca baca(2) permintaan ditolakEACCES. Ini karena klien melakukanBuka dengan memeriksa izin, 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

nama jalan sudah ada danO_CREAT danO_EXCL telah dipakai.

EISDIR

nama jalan mengacu pada direktori dan akses yang diminta termasuk menulis (yaitu,O_WRONLY atauO_RDWR diatur).

EACCES

Akses yang diminta ke file tidak diizinkan, atau salah satu direktori di nama jalan tidak mengizinkan izin pencarian (eksekusi), atau file belum ada dan akses tulis ke direktori induk tidak diizinkan.

ENAMETOOLONG

nama jalan terlalu lama.

ENOENT

O_CREAT tidak disetel dan file yang dinamai tidak ada. Atau, komponen direktori di nama jalan tidak ada atau merupakan tautan simbolis yang menggantung.

ENOTDIR

Komponen yang digunakan sebagai direktori di nama jalan tidak, pada kenyataannya, direktori, atauO_DIRECTORYditentukan dan nama jalan bukan 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

nama jalan merujuk ke file khusus perangkat dan tidak ada perangkat yang sesuai. (Ini adalah bug kernel Linux - dalam situasi ini ENXIO harus dikembalikan.)

EROFS

nama jalan mengacu pada file pada sistem file read-only dan akses tulis diminta.

ETXTBSY

nama jalan mengacu pada gambar eksekusi yang saat ini sedang dieksekusi dan akses tulis diminta.

EFAULT

nama jalan menunjukkan di luar ruang alamat Anda yang dapat diakses.

ELOOP

Terlalu banyak tautan simbolis yang ditemukan dalam penyelesaian nama jalan , atauO_NOFOLLOW ditentukan tetapi nama jalan adalah tautan simbolis.

ENOSPC

nama jalan harus dibuat tetapi perangkat mengandung nama jalan 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.3O_NOFOLLOW danO_DIRECTORY bendera adalah khusus untuk Linux. Seseorang mungkin harus mendefinisikan_GNU_SOURCE makro untuk mendapatkan definisi mereka.

Batasan

Ada banyak infelicities dalam protokol yang mendasari NFS, yang mempengaruhi antara lainO_SYNC danO_NDELAY.

POSIX menyediakan untuk tiga varian yang berbeda dari I / O tersinkronisasi, sesuai dengan benderaO_SYNC , O_DSYNC dan O_RSYNC. Saat ini (2.1.130) ini semua identik di Linux.