Definisi Fungsi
Sebelum menentukan fungsi baca dalam kod anda, anda harus memasukkan beberapa pakej yang diperlukan.
#sertakanInilah 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.