Fungsi Baca POSIX dalam Pemrograman C

Posix Read Function C Programing

Dalam sistem operasi tradisional yang kompatibel dengan POSIX, untuk mendapatkan informasi dari dokumen yang terdapat dalam sistem file, sebuah program menggunakan panggilan sistem baca. Sebuah deskriptor dokumen yang biasanya diakses dari panggilan sebelumnya untuk membuka ditentukan oleh file. Panggilan sistem baca ini membacakan informasi dalam byte dan bilangan bulat yang ditentukan oleh pemanggil dari dokumen, dan kemudian menyimpannya dalam buffer yang disediakan oleh mekanisme panggilan.

Definisi Fungsi

Sebelum mendefinisikan fungsi baca dalam kode Anda, Anda harus menyertakan beberapa paket yang diperlukan.



#termasuk

Inilah cara Anda mendefinisikan fungsi baca POSIX:



>>ssize_t sebelum(ke dalamgading,ruang kosong *penggemar,ukuran_tnbyte, off_t offset);
>>ssize_t baca(ke dalamfd,ruang kosong *penggemar,ukuran_tnbyte);

Tiga argumen parameter dapat diambil dari pemanggilan metode baca:



int fd: File deskriptor file dari mana informasi akan dibaca. Kita bisa menggunakan deskriptor file yang diperoleh melalui panggilan sistem terbuka, atau kita bisa menggunakan 0, 1, atau 2 yang mengacu pada input tipikal, output reguler, atau kesalahan reguler.

Batal *buf: Buffer atau array karakter tempat data yang dibaca harus disimpan dan disimpan.

Ukuran_t nbyte: Jumlah byte yang perlu dibaca dari dokumen sebelum dipotong. Semua informasi dapat disimpan dalam buffer jika informasi yang akan dibaca lebih pendek dari nbytes.



Keterangan

Metode read() mencoba membaca byte 'nbyte' ke dalam cache buffer yang dirujuk oleh 'buf' baik dari file yang terhubung dengan deskriptor dokumen terbuka 'Fildes' atau 'fd'. Itu tidak menentukan sifat beberapa pembacaan simultan pada aliran, FIFO, atau unit terminal yang sama.

Pada dokumen yang memungkinkan pembacaan, proses membaca dimulai pada offset dokumen, dan offset ditingkatkan dengan jumlah byte yang dibaca. Jika offset dokumen berada pada atau di luar tepi file, tidak ada byte yang dibaca, dan read() tidak menghasilkan apa pun.

Ketika hitungannya adalah 0, read() akan mengenali kesalahan yang disebutkan di bawah ini. Jika tidak ada kesalahan, atau jika read() tidak diperhitungkan dengan Kesalahan, read() menghasilkan nol dengan hitungan 0 dan karenanya tidak memiliki dampak lain.

Jika hitungan lebih tinggi dari SSIZE_MAX, sesuai POSIX.1, maka hasilnya ditentukan oleh implementasi.

Nilai Kembali

Jumlah byte 'read' dan 'pread' yang dikembalikan setelah pencapaian harus berupa bilangan bulat non-negatif sementara nol menunjuk ke akhir file. Posisi dokumen dimajukan dengan nomor ini, atau yang lain, untuk menandakan kesalahan, metode mengembalikan -1 dan menetapkan 'errno'. Bila angka ini kurang dari jumlah byte yang diminta, itu bukan kesalahan byte. Mungkin saja lebih sedikit byte yang tersedia untuk saat ini.

kesalahan

Fungsi baca dan baca tidak akan berhasil jika kesalahan ini terjadi:

LAGI:

Dokumen atau deskriptor file 'fd' milik file non-socket yang telah diberi label sebagai non-blocking (O NONBLOCK) dan akan memblokir pembacaan.

BLOK:

Deskriptor 'fd' milik soket yang telah diberi label sebagai non-blocking (O_NONBLOCK) dan akan memblokir pembacaan.

EBADF:

'fd' mungkin bukan deskriptor yang dapat digunakan, atau mungkin tidak terbuka untuk dibaca.

KESALAHAN:

Ini terjadi ketika 'buf' Anda berada di luar ruang alamat yang dapat dijangkau.

ENTR:

Sebelum pembacaan data informasi, panggilan mungkin terputus oleh sinyal.

PILIHAN:

Kesalahan ini terjadi ketika deskriptor 'fd' Anda terlibat dalam suatu objek, yang tidak sesuai untuk dibaca, atau dokumen dilepaskan dengan flag O_DIRECT, dan satu atau alamat lain yang dinyatakan dalam 'buf', nilai yang ditunjukkan dalam 'count ', atau offset dokumen tidak terkait dengan tepat.

PILIHAN:

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

EIO:

Ini adalah kesalahan input/output. Itu terjadi ketika grup proses latar belakang mencoba membaca dari terminal pengaturnya, dan satu atau yang lain mengabaikan atau memblokir SIGTTIN, atau grup prosesnya kehilangan. Alasan lain untuk kesalahan ini adalah kesalahan input/output tingkat rendah saat membaca dari hard disk atau tape. Penyebab potensial lain dari EIO pada file data jaringan adalah penghapusan penguncian penasehat pada deskriptor file dan kegagalan kunci itu.

EISDIR:

Deskriptor file 'fd' milik direktori.

Catatan:

Banyak kesalahan lain juga dapat terjadi, bergantung pada objek yang ditautkan ke deskriptor 'fd'. Bentuk size_t dan ssize_t tidak bertanda dan bertanda tipe data numerik yang ditentukan oleh POSIX.1. Di Linux, paling banyak 0x7ffff000 (2.147.479.552) byte dapat ditransmisikan dengan fungsi membaca (dan panggilan sistem yang setara), mengembalikan jumlah byte yang awalnya ditransmisikan (pada platform 32-bit dan 64-bit). Dengan sistem file NFS, saat pertama stempel waktu diubah dengan membaca aliran kecil informasi, panggilan berikutnya tidak akan melakukannya. Ini dipicu oleh caching atribut sisi klien karena, meskipun tidak semua, klien NFS berhenti memperbarui ke server melalui st_atime (waktu akses file terakhir) dan pembacaan sisi klien yang dipenuhi dari buffer klien tidak akan memicu perubahan pada st- atime di server karena tidak ada pembacaan sisi server yang tersedia. Dengan menghapus cache atribut sisi klien, metadata UNIX dapat diakses, tetapi ini akan secara signifikan meningkatkan beban pada server dan memengaruhi produktivitas dalam banyak kasus.

Contoh 01:

Berikut adalah program C untuk mendemonstrasikan pemanggilan fungsi baca pada Sistem Linux. Tulis perintah di bawah ini seperti di file baru. Tambahkan perpustakaan, dan dalam fungsi utama, inisialisasi deskriptor dan ukuran. Deskriptor membuka file, dan ukuran digunakan untuk membaca data file.

Output untuk kode di atas akan seperti yang ditunjukkan pada gambar di bawah ini.

Contoh 02:

Contoh lain untuk mengilustrasikan cara kerja fungsi baca diberikan di bawah ini.

Buat file lain dan tuliskan kode di bawah ini seperti di dalamnya. Berikut adalah dua deskriptor, fd1 & fd2, yang keduanya memiliki akses file tabel terbuka sendiri. Jadi untuk foobar.txt, setiap deskriptor memang memiliki lokasi filenya sendiri. Byte pertama foobar.txt diterjemahkan dari fd2, dan hasilnya adalah c = f, bukan c = o.

Kesimpulan

Kami telah membaca fungsi baca POSIX dalam pemrograman C secara efisien. Semoga tidak ada lagi keraguan.