Fungsi Baca POSIX dalam Pengaturcaraan C

Posix Read Function C Programing



Dalam sistem operasi tradisional yang serasi 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(intgading,batal *buf,saiz_tnbyte, off_t mengimbangi);
>>ssize_t membaca(intfd,batal *buf,saiz_tnbytes);

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 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 pada POSIX.1, maka hasilnya ditentukan oleh pelaksanaannya.

Nilai Pulangan

Angka bait 'baca' dan 'pread' yang dibalikkan pada pencapaian mestilah bilangan bulat bukan negatif sementara sifar menunjuk 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 lebih 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 yang boleh dijangkau.

EINTR:

Sebelum pembacaan data maklumat, panggilan mungkin putus oleh isyarat.

PILIHAN:

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.

PILIHAN:

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

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 berkabung. Sebab lain untuk ralat ini ialah ralat input / output peringkat rendah sementara membaca dari cakera keras atau pita. Punca lain yang berpotensi 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 mula-mula dihantar (pada kedua-dua 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 dilakukan. 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 klien, 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 deskriptor memang mempunyai lokasi failnya. Bait pertama foobar.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.