Chức năng đọc POSIX trong lập trình C

Posix Read Function C Programing



Trong các hệ điều hành tương thích POSIX truyền thống, để lấy thông tin từ tài liệu có trong hệ thống tệp, một chương trình đã sử dụng lệnh gọi hệ thống đọc. Một bộ mô tả tài liệu thường được truy cập từ lệnh gọi mở trước đó được định nghĩa bởi tệp. Lệnh gọi hệ thống đọc này đọc thông tin theo byte và số nguyên mà người gọi chỉ định từ tài liệu, sau đó lưu nó vào bộ đệm do cơ chế gọi cung cấp.

Định nghĩa hàm

Trước khi xác định chức năng đọc trong mã của bạn, bạn phải bao gồm một số gói bắt buộc.







#bao gồm

Đây là cách bạn xác định chức năng đọc POSIX:



>>ssize_t pread(NSngà voi,vô hiệu *buf,size_tnbyte, bù trừ off_t);
>>ssize_t đã đọc(NSfd,vô hiệu *buf,size_tnbyte);

Ba đối số tham số có thể được lấy từ lệnh gọi phương thức đọc:



int fd: Bộ mô tả tệp của tệp mà từ đó thông tin sẽ được đọc. Chúng tôi có thể đang sử dụng bộ mô tả tệp có được thông qua lệnh gọi hệ thống mở hoặc chúng tôi có thể chỉ sử dụng 0, 1 hoặc 2 đề cập đến đầu vào điển hình, đầu ra thông thường hoặc lỗi thông thường, tương ứng.





Void * buf: Bộ đệm hoặc mảng ký tự trong đó dữ liệu đã đọc nên được lưu và giữ.

Size_t nbyte: Số byte cần đọc từ tài liệu trước khi cắt bớt. Tất cả thông tin có thể được lưu trữ trong bộ đệm nếu thông tin được đọc ngắn hơn nbyte.



Sự miêu tả

Phương thức read () cố gắng đọc các byte ‘nbyte’ vào bộ đệm đệm được tham chiếu bởi ‘buf’ từ tệp được kết nối với bộ mô tả tài liệu đang mở ‘Fildes’ hoặc ‘fd’. Nó không xác định bản chất của một số lần đọc đồng thời trên cùng một luồng, FIFO hoặc đơn vị đầu cuối.

Trên các tài liệu cho phép đọc, quá trình đọc bắt đầu ở phần bù của tài liệu và phần bù được tăng lên theo số byte được đọc. Nếu độ lệch của tài liệu nằm ở hoặc ngoài mép của tệp, thì không có byte nào được đọc và read () không có kết quả nào.

Khi số đếm là 0, read () sẽ nhận ra các lỗi được đề cập bên dưới. Nếu không có sai sót hoặc nếu read () không được tính với Lỗi, thì read () cho kết quả bằng 0 với số đếm là 0 và do đó không có hậu quả nào khác.

Nếu số lượng cao hơn SSIZE_MAX, theo POSIX.1, thì kết quả được xác định bởi quá trình triển khai.

Giá trị trả lại

Số byte ‘read’ và ‘pread’ được hoàn nguyên khi đạt được thành tích phải là một số nguyên không âm trong khi số 0 trỏ đến cuối tệp. Vị trí tài liệu được tiến hành bởi số này, hoặc nếu không, để biểu thị lỗi, các phương thức trả về -1 và gán ‘errno’. Khi con số này nhỏ hơn số byte được yêu cầu, nó không phải là byte nhầm lẫn. Có thể hiện tại có ít byte hơn.

Lỗi

Chức năng đọc trước và đọc sẽ không thành công nếu các lỗi này xảy ra:

EAGAIN:

Bộ mô tả tài liệu hoặc tệp ‘fd’ thuộc về tệp không phải ổ cắm đã được gắn nhãn là không chặn (O NONBLOCK) và sẽ chặn việc đọc.

EWOVERBLOCK:

Bộ mô tả ‘fd’ thuộc về một ổ cắm đã được gắn nhãn là không chặn (O_NONBLOCK) và sẽ chặn việc đọc.

EBADF:

‘Fd’ có thể không phải là một bộ mô tả có thể sử dụng được hoặc nó có thể không được mở để đọc.

TẠO RA:

Điều này xảy ra khi ‘buf’ của bạn nằm ngoài vùng địa chỉ có thể truy cập của bạn.

EINTR:

Trước khi đọc dữ liệu thông tin, cuộc gọi có thể đã bị ngắt bởi một tín hiệu.

LỰA CHỌN:

Lỗi này xảy ra khi bộ mô tả 'fd' của bạn liên quan đến một đối tượng, đối tượng này không thích hợp để đọc hoặc tài liệu đã được tháo gỡ bằng cờ O_DIRECT và một hoặc địa chỉ khác được nêu trong 'buf', giá trị được chỉ ra trong 'count ', hoặc phần bù của tài liệu không được liên kết thích hợp.

LỰA CHỌN:

Bộ mô tả ‘fd’ có thể đã được tạo bằng cách gọi đến timerfd_create (2) và bộ đệm kích thước không chính xác đã được cấp để đọc.

EIO:

Đó là một lỗi đầu vào / đầu ra. Nó xảy ra khi nhóm quy trình nền cố gắng đọc từ thiết bị đầu cuối quy định của nó và một hoặc nhóm khác bỏ qua hoặc chặn SIGTTIN, hoặc nhóm quy trình của nó được lưu lại. Một lý do khác cho lỗi này có thể là lỗi đầu vào / đầu ra mức thấp trong khi đọc từ đĩa cứng hoặc băng. Một nguyên nhân tiềm ẩn khác của EIO trên các tệp dữ liệu được nối mạng là việc loại bỏ khóa tư vấn trên bộ mô tả tệp và sự cố của khóa đó.

EISDIR:

Bộ mô tả tệp ‘fd’ thuộc về một thư mục.

Ghi chú:

Nhiều lỗi khác cũng có thể xảy ra, tùy thuộc vào đối tượng được liên kết với bộ mô tả ‘fd’. Cả hai biểu mẫu size_t và ssize_t đều là kiểu dữ liệu số không được đánh dấu và đánh dấu được xác định bởi POSIX.1. Trên Linux, tối đa 0x7ffff000 (2.147.479.552) byte có thể được truyền bằng hàm đọc (và các lệnh gọi hệ thống tương đương), trả về số byte được truyền ban đầu (trên cả nền tảng 32 bit và 64 bit). Với hệ thống tệp NFS, ngay khoảnh khắc đầu tiên dấu thời gian được thay đổi bằng cách đọc các luồng thông tin nhỏ, các lệnh gọi tiếp theo sẽ không làm như vậy. Nó được kích hoạt bằng cách lưu vào bộ nhớ đệm các thuộc tính phía máy khách vì, mặc dù không phải tất cả, các máy khách NFS bỏ cập nhật lên máy chủ thông qua st_atime (thời gian truy cập tệp cuối cùng) và các lần đọc phía máy khách được thực hiện từ bộ đệm của máy khách sẽ không kích hoạt các thay đổi đối với st- thời gian trên máy chủ vì không có bài đọc phía máy chủ nào khả dụng. Bằng cách xóa bộ nhớ đệm thuộc tính phía máy khách, siêu dữ liệu UNIX có thể được truy cập, nhưng điều này sẽ làm tăng đáng kể tải trên máy chủ và ảnh hưởng đến năng suất trong hầu hết các trường hợp.

Ví dụ 01:

Đây là một chương trình C để chứng minh lệnh gọi hàm đọc trên Hệ thống Linux. Viết lệnh dưới đây như trong một tệp mới. Thêm thư viện và trong chức năng chính, khởi tạo bộ mô tả và kích thước. Bộ mô tả đang mở tệp và kích thước được sử dụng để đọc dữ liệu tệp.

Đầu ra cho đoạn mã trên sẽ như trong hình dưới đây.

Ví dụ 02:

Một ví dụ khác để minh họa hoạt động của hàm đọc được đưa ra dưới đây.

Tạo một tệp khác và viết ra mã bên dưới như trong đó. Đây là hai bộ mô tả, fd1 & fd2, cả hai đều có quyền truy cập tệp bảng mở của riêng chúng. Vì vậy, đối với foobar.txt, mọi bộ mô tả đều có vị trí tệp của nó. Byte đầu tiên của foobar.txt được dịch từ fd2 và kết quả là c = f, không phải c = o.

Phần kết luận

Chúng tôi đã đọc hàm đọc POSIX trong lập trình C một cách hiệu quả. Hy vọng rằng không còn nghi ngờ gì nữa.