Pemrograman C

Fungsi Baca POSIX dalam Pemrograman C

Fungsi Baca POSIX dalam Pemrograman C
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 didefinisikan 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 pread(int fildes, void *buf, size_t nbyte, off_t offset);
>> ssize_t read(int fd, void *buf, size_t nbytes);

Tiga argumen parameter dapat diambil dari pemanggilan metode baca:

int fd: Deskriptor file dari file tempat 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.

Deskripsi

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

Pada dokumen yang memungkinkan pembacaan, proses pembacaan 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 hitungannya lebih tinggi dari SSIZE_MAX, sesuai POSIX.1, maka hasil ditentukan oleh pelaksanaannya.

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'. Ketika 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 membaca data informasi, panggilan mungkin terputus oleh sinyal.

ENVAL:

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.

ENVAL:

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 pengaturannya, dan satu atau yang lain mengabaikan atau memblokir SIGTTIN, atau grup prosesnya kehilangan. Alasan lain untuk kesalahan ini bisa jadi 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 ditandai dan ditandai 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 di 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 menggambarkan 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. 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 keraguan lagi.

Distro Linux Terbaik untuk Gaming pada tahun 2021
Sistem operasi Linux telah berkembang jauh dari tampilan aslinya, sederhana, berbasis server. OS ini telah sangat meningkat dalam beberapa tahun terak...
Cara merekam dan streaming sesi permainan Anda di Linux
Dulu, bermain game hanya dianggap sebagai hobi, namun seiring berjalannya waktu, industri game mengalami pertumbuhan yang sangat pesat baik dari segi ...
Game Terbaik untuk Dimainkan dengan Pelacakan Tangan
Oculus Quest baru-baru ini memperkenalkan ide hebat pelacakan tangan tanpa pengontrol. Dengan jumlah permainan dan aktivitas yang terus meningkat yang...