C Програмування

Функція читання POSIX у програмуванні на C

Функція читання POSIX у програмуванні на C
У традиційних операційних системах, сумісних з POSIX, для отримання інформації з документа, що міститься у файловій системі, програма використовувала системний виклик read. Дескриптор документа, до якого зазвичай здійснюється доступ з попереднього виклику для відкриття, визначається файлом. Цей системний виклик зчитування зчитує інформацію в байтах і ціле число, яке абонент вказує з документа, а потім зберігає її в буфері, передбаченому механізмом виклику.

Визначення функції

Перш ніж визначати функцію читання у коді, вам слід включити деякі необхідні пакети.

#включати

Ось як ви визначаєте функцію читання POSIX:

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

З виклику методу read можна взяти три аргументи параметрів:

int fd: Дескриптор файлу, звідки слід прочитати інформацію. Ми можемо або використовувати дескриптор файлу, отриманий через відкритий системний виклик, або ми могли б просто використовувати 0, 1 або 2, посилаючись на типовий вхід, регулярний вивід або звичайну помилку, відповідно.

Порожнеча * buf: Буфер або масив символів, в якому прочитані дані слід зберігати та зберігати.

Розмір_т нбайт: Кількість байтів, яку потрібно було прочитати з документа перед усіченням. Уся інформація може зберігатися в буфері, якщо інформація, яку потрібно прочитати, менша за нбайтів.

Опис

Метод read () намагається прочитати байти 'nbyte' у буферному кеші, на який посилається 'buf', або з файлу, пов'язаного з відкритим дескриптором документа 'Fildes' або 'fd'. Він не визначає природу декількох одночасних зчитувань в одному потоці, FIFO або термінальному блоці.

У документах, що дозволяють читати, процес читання починається зі зміщення документа, і зміщення збільшується на кількість прочитаних байтів. Якщо зміщення документа досягає або менше краю файлу, прочитаних байтів немає, а read () не дає жодного.

Коли підрахунок дорівнює 0, read () розпізнає помилки, згадані нижче. Якщо помилок немає або якщо read () не враховується з помилками, read () видає нуль з рахунком 0 і тому не має інших наслідків.

Якщо кількість перевищує SSIZE_MAX, відповідно до POSIX.1, то результат визначається реалізацією.

Повернене значення

Число байтів "read" і "pread", повернене після досягнення, має бути цілим невід'ємним числом, тоді як нуль вказує на кінець файлу. Позиція документа прогресується за цим номером, або ж для позначення помилки, методи повертають -1 і призначають 'errno'. Коли ця цифра менша за кількість запитуваних байтів, це не байт помилки. Можливо, наразі доступно менше байтів.

Помилки

Функція попереднього читання та читання буде невдалою, якщо трапляються такі помилки:

EAGAIN:

Дескриптор документа або файлу 'fd' належить нерозетковому файлу, який був позначений як неблокуючий (O NONBLOCK) і заблокує читання.

EWOULDBLOCK:

Дескриптор 'fd' належить до сокета, який був позначений як неблокуючий (O_NONBLOCK) і заблокує читання.

EBADF:

'Fd' може не бути придатним для використання дескриптором або може бути не відкритим для читання.

ВРІЗ:

Це трапляється, коли ваш `` buf '' знаходиться поза доступним адресним простором.

EINTR:

Перед зчитуванням інформаційних даних дзвінок, можливо, розірвався сигналом.

EINVAL:

Ця помилка виникає, коли ваш дескриптор "fd" бере участь у об'єкті, який непридатний для читання, або документ розв'язано прапором O_DIRECT і одна чи інша адреса вказана в "buf", значення вказане в "count ', або зміщення документа не пов'язане належним чином.

EINVAL:

Дескриптор 'fd', можливо, був сформований із використанням виклику timerfd_create (2), а для читання було надано неправильний буфер розміру.

EIO:

Це помилка вводу / виводу. Це відбувається, коли фонова група процесів намагається зчитувати з її регуляторного терміналу, і той чи інший пропускає або блокує SIGTTIN, або її група процесів втрачається. Іншою причиною цієї помилки може бути низькорівнева помилка вводу / виводу, тим часом читання з жорсткого диска або стрічки. Ще однією потенційною причиною EIO для мережевих файлів даних є усунення консультативного блокування дескриптора файлу та несправність цього блокування.

EISDIR:

Дескриптор файлу 'fd' належить до каталогу.

Примітки:

Також може виникати багато інших помилок, які залежать від об'єкта, пов'язаного з дескриптором "fd". Форми size_t та ssize_t є безмаркерними та позначеними числовими типами даних, визначеними POSIX.1. У Linux щонайбільше 0x7ffff000 (2 147 479 552) байт може передаватися функцією читання (та еквівалентними системними викликами), повертаючи кількість спочатку переданих байтів (як на 32-бітній, так і на 64-бітній платформах). У файлових системах NFS лише в перший момент мітка часу змінюється шляхом читання крихітних потоків інформації, наступні дзвінки не роблять цього. Це ініціюється кешуванням атрибутів на стороні клієнта, оскільки, хоча і не всі, клієнти NFS припиняють оновлення до сервера через st_atime (час останнього доступу до файлу), а читання на стороні клієнта, виконане з буфера клієнта, не спричинить зміни до st- atime на сервері, оскільки відсутні дані з боку сервера. Видаливши кешування атрибутів на стороні клієнта, можна отримати доступ до метаданих UNIX, але це значно збільшить навантаження на сервер і в більшості випадків вплине на продуктивність.

Приклад 01:

Ось програма C, яка демонструє виклик функції читання в системі Linux. Напишіть команду нижче, як вона є у новому файлі. Додайте бібліотеки, а в основній функції ініціалізуйте дескриптор та розмір. Дескриптор відкриває файл, а розмір використовується для зчитування даних файлу.

Вихідні дані для коду вище будуть такими, як показано на малюнку нижче.

Приклад 02:

Інший приклад для ілюстрації роботи функції читання наведено нижче.

Створіть інший файл і запишіть код нижче, як він є в ньому. Ось два дескриптори, fd1 і fd2, які обидва мають власний доступ до файлу відкритої таблиці. Тож для foobar.txt, кожен дескриптор має своє розташування файлу. Самий перший байт foobar.txt перекладається з fd2, і результат є c = f, а не c = o.

Висновок

Ми ефективно прочитали функцію читання POSIX у програмуванні на C. Сподіваємось, сумнівів не залишилось.

Як використовувати Xdotool для стимулювання клацань миші та натискань клавіш у Linux
Xdotool - це безкоштовний інструмент командного рядка з відкритим кодом для імітації клацань миші та натискань клавіш. У цій статті буде розглянуто ко...
Топ 5 ергономічних продуктів для комп'ютерної миші для Linux
Чи викликає тривале використання комп’ютера біль у зап’ясті або пальцях? Ви страждаєте від ригідності суглобів і вам постійно доводиться трясти руки? ...
How to Change Mouse and Touchpad Settings Using Xinput in Linux
Most Linux distributions ship with “libinput” library by default to handle input events on a system. It can process input events on both Wayland and X...