2014-04-16 13 views
5

Tôi đã nhìn thấy tuyên bố sau trong một vài chương trình, hầu hết/tất cả dường như được tạo cho Linux.đọc (fd, NULL, 0); nó làm gì? nó được xác định rõ?

rv = read(fd, NULL, 0); 

Trong một số chương trình trong vòng lặp, trong một số câu lệnh duy nhất.

Nó thực sự làm gì?

Trang người đàn ông nói rằng lời gọi như thế này có thể hoặc không thể kiểm tra lỗi ...

Ý nghĩa của giá trị trả lại là gì?

Loại mô tả tệp nào được hỗ trợ?

Và nếu rv==0 cách phân biệt "không có lỗi", ví dụ: "đóng socket".

Trả lời

7

Cuộc gọi này sẽ thực hiện tất cả các kiểm tra lỗi thông thường trên bộ mô tả tệp nhưng không truy xuất bất kỳ dữ liệu nào từ đó. Điều này rất hữu ích nếu bạn muốn ví dụ xác định xem bộ mô tả tập tin vẫn hợp lệ mà không chặn nó.

Nó sẽ trả về -1 nếu xảy ra lỗi và 0 nếu không. Hầu hết các lỗi được liệt kê trong man 2 read có thể được truy vấn theo cách này và sẽ được trả lại trong errno.

Ví dụ: giá trị trả lại là -1errno của EBADF sẽ được retuned nếu bộ mô tả tệp bị đóng. Thay vào đó giá trị trả về sẽ là 0 nếu mọi thứ đều tốt và một read sẽ không trả về lỗi liên quan đến tính hợp lệ của bộ mô tả tệp.

Một tiếp theo read với một bộ đệm thực và nbyte > 0 vẫn có thể tạo ra bất kỳ số lỗi như ENOMEM, EAGAIN ...

+5

Dường như căn bản không cầm tay. Người đọc linux (3) đọc trang nói rằng: 'Việc triển khai được cho phép, nhưng không bắt buộc, để thực hiện kiểm tra lỗi cho các yêu cầu read() của byte không.' POSIX nói: Trước khi bất kỳ hành động nào được thực hiện, và nếu nbyte bằng 0,() chức năng * có thể * phát hiện và trả về lỗi. – Duck

Các vấn đề liên quan