Pengaturcaraan C

Fungsi Baca POSIX dalam Pengaturcaraan C

Fungsi Baca POSIX dalam Pengaturcaraan C
Dalam sistem operasi tradisional yang kompatibel dengan POSIX, untuk mendapatkan maklumat dari dokumen yang terdapat dalam sistem fail, program menggunakan panggilan sistem baca. Deskriptor dokumen yang biasanya diakses dari panggilan sebelumnya untuk dibuka ditentukan oleh fail. Panggilan sistem baca ini membaca maklumat dalam bait dan bilangan bulat yang ditentukan oleh pemanggil dari dokumen, dan kemudian menyimpannya dalam penyangga yang disediakan oleh mekanisme panggilan.

Definisi Fungsi

Sebelum menentukan fungsi baca dalam kod anda, anda harus memasukkan beberapa pakej yang diperlukan.

#sertakan

Inilah cara anda menentukan fungsi baca POSIX:

>> ssize_t pread (int fildes, void * buf, size_t nbyte, off_t offset);
>> ssize_t baca (int fd, void * buf, size_t nbytes);

Tiga argumen parameter dapat diambil dari panggilan kaedah baca:

int fd: Deskriptor fail dari mana maklumat itu hendak dibaca. Kita boleh menggunakan deskriptor file yang diperoleh melalui panggilan sistem terbuka, atau kita hanya dapat menggunakan 0, 1, atau 2 masing-masing merujuk pada input biasa, output biasa, atau kesalahan biasa.

Tidak sah * buf: Penyangga atau susunan watak di mana data yang dibaca harus disimpan dan disimpan.

Size_t nbyte: Bilangan bait yang perlu dibaca dari dokumen sebelum dipotong. Semua maklumat boleh disimpan dalam penyangga sekiranya maklumat yang akan dibaca lebih pendek daripada nbytes.

Penerangan

Kaedah baca () cuba membaca bait 'nbyte' ke dalam cache penyangga yang disebut oleh 'buf' dari mana-mana fail yang dihubungkan dengan penerangan dokumen terbuka 'Fildes' atau 'fd'. Ia tidak menentukan sifat beberapa bacaan serentak pada aliran yang sama, FIFO, atau unit terminal.

Pada dokumen yang membolehkan pembacaan, proses pembacaan bermula pada offset dokumen, dan ofset ditingkatkan dengan jumlah bait yang dibaca. Sekiranya offset dokumen berada di atau di luar tepi fail, tidak ada byte yang dibaca, dan read () tidak menghasilkan.

Apabila kiraannya adalah 0, baca () akan mengenali kesalahan yang disebutkan di bawah. Sekiranya tidak ada kesalahan, atau jika baca () tidak diperhitungkan dengan Kesalahan, bacaan () menghasilkan sifar dengan kiraan 0 dan oleh itu tidak mempunyai kesan lain.

Sekiranya kiraannya lebih tinggi daripada SSIZE_MAX, seperti di POSIX.1, maka hasilnya ditentukan oleh pelaksanaannya.

Nilai Pulangan

Angka bait 'baca' dan 'pread' yang dibalikkan pada pencapaian mestilah bilangan bulat bukan negatif sementara titik sifar ke akhir fail. Kedudukan dokumen dilanjutkan dengan nombor ini, atau yang lain, untuk menandakan kesalahan, kaedah mengembalikan -1 dan menetapkan 'errno'. Apabila angka ini kurang daripada jumlah bait yang diminta, itu bukan kesalahan bait. Mungkin ada sedikit bait yang tersedia buat masa ini.

Kesalahan

Fungsi pread dan read tidak akan berjaya sekiranya kesalahan ini berlaku:

EAGAIN:

Dokumen atau deskriptor fail 'fd' tergolong dalam fail bukan soket yang telah dilabel sebagai tidak menyekat (O NONBLOCK) dan akan menyekat pembacaan.

EWOULDBLOCK:

Penerangan 'fd' tergolong dalam soket yang telah dilabel sebagai tidak menyekat (O_NONBLOCK) dan akan menyekat pembacaan.

EBADF:

'Fd' mungkin bukan penerangan yang boleh digunakan, atau mungkin tidak terbuka untuk dibaca.

KESAN:

Ini berlaku apabila 'buf' anda berada di luar ruang alamat anda.

EINTR:

Sebelum membaca data maklumat, panggilan mungkin telah diputuskan oleh isyarat.

EINVAL:

Kesalahan ini berlaku apabila deskriptor 'fd' anda terlibat dalam objek, yang tidak sesuai untuk dibaca, atau dokumen itu terikat dengan bendera O_DIRECT, dan satu atau alamat lain dinyatakan dalam 'buf', nilai yang ditunjukkan dalam 'hitungan ', atau ofset dokumen tidak berkaitan dengan betul.

EINVAL:

Penerangan 'fd' mungkin telah dibentuk menggunakan panggilan untuk timerfd_create (2), dan penyangga ukuran yang salah telah diberikan untuk membaca.

EIO:

Ini adalah ralat input / output. Ia berlaku apabila kumpulan proses latar belakang cuba membaca dari terminal pengawalseliaannya, dan satu atau yang lain menghadap atau menyekat SIGTTIN, atau kumpulan prosesnya sedang sedih. Sebab lain untuk ralat ini ialah ralat input / output tahap rendah sementara membaca dari cakera keras atau pita. Punca lain yang berpotensi menyebabkan EIO pada fail data rangkaian adalah penghapusan kunci penasihat pada deskriptor fail dan kegagalan kunci tersebut.

EISDIR:

Penerangan fail 'fd' tergolong dalam direktori.

Catatan:

Banyak kesalahan lain juga mungkin berlaku, bergantung pada objek yang dihubungkan dengan deskriptor 'fd'. Kedua-dua bentuk size_t dan ssize_t adalah jenis data berangka yang tidak ditandai dan ditandakan yang ditentukan oleh POSIX.1. Pada Linux, paling banyak 0x7ffff000 (2,147,479,552) bait boleh dihantar dengan fungsi membaca (dan panggilan sistem yang setara), mengembalikan jumlah bait yang awalnya dihantar (pada platform 32-bit dan 64-bit). Dengan sistem fail NFS, pada saat pertama cap waktu diubah dengan membaca aliran maklumat kecil, panggilan berikutnya tidak akan melakukannya. Ini dipicu oleh cache atribut sisi klien kerana, walaupun tidak semua, klien NFS berhenti mengemas kini ke pelayan melalui st_atime (waktu akses fail terakhir) dan bacaan sisi klien yang dipenuhi dari penyangga klien tidak akan mencetuskan perubahan pada st- atime di pelayan kerana tidak ada bacaan di sisi pelayan. Dengan membuang cache atribut sisi pelanggan, metadata UNIX dapat diakses, tetapi ini akan meningkatkan beban pada pelayan dengan ketara dan mempengaruhi produktiviti dalam kebanyakan kes.

Contoh 01:

Berikut adalah program C untuk menunjukkan panggilan fungsi baca di Sistem Linux. Tuliskan arahan di bawah seperti dalam fail baru. Tambahkan perpustakaan, dan dalam fungsi utama, mulakan penerangan dan ukuran. Deskriptor membuka file, dan ukuran digunakan untuk membaca data file.

Keluaran untuk kod di atas adalah seperti yang ditunjukkan pada gambar di bawah.

Contoh 02:

Contoh lain untuk menggambarkan fungsi fungsi baca diberikan di bawah.

Buat fail lain dan tuliskan kod di bawah seperti yang ada di dalamnya. Berikut adalah dua penerangan, fd1 & fd2, yang kedua-duanya mempunyai akses fail meja terbuka mereka sendiri. Jadi untuk foobar.txt, setiap penerangan mempunyai lokasi failnya. Bait foobar pertama.txt diterjemahkan dari fd2, dan hasilnya adalah c = f, bukan c = o.

Kesimpulannya

Kami telah membaca fungsi membaca POSIX dalam pengaturcaraan C dengan cekap. Mudah-mudahan, tidak ada keraguan yang tersisa.

Cara menangkap dan streaming sesi permainan anda di Linux
Pada masa lalu, bermain permainan hanya dianggap sebagai hobi, tetapi seiring dengan berjalannya waktu, industri permainan menyaksikan pertumbuhan yan...
Permainan Terbaik untuk Dimainkan dengan Penjejakan Tangan
Oculus Quest baru-baru ini memperkenalkan idea hebat penjejakan tangan tanpa pengawal. Dengan jumlah permainan dan aktiviti yang semakin meningkat yan...
Cara Menunjukkan Overlay OSD dalam Aplikasi dan Permainan Linux Skrin Penuh
Bermain permainan skrin penuh atau menggunakan aplikasi dalam mod skrin penuh bebas gangguan dapat memisahkan anda dari maklumat sistem yang relevan y...