2010-07-02 5 views
129

Tôi có số FILE *, được trả lại bằng một cuộc gọi đến fopen(). Tôi cần phải có một bộ mô tả tập tin từ nó, để thực hiện các cuộc gọi như fsync(fd) trên đó. Chức năng để có được một mô tả tập tin từ một con trỏ tập tin là gì?Làm cách nào để chuyển đổi một con trỏ tệp (FILE * fp) thành một bộ mô tả tệp (int fd)?

+7

tự câu trả lời theo hình thức này "nguy hiểm" được khuyến khích. – dmckee

+0

Hoặc bạn có thể mở tệp bằng mở (2) và bạn sẽ có bộ mô tả tệp từ đầu –

+6

Và ngược lại: [Cách nhận con trỏ FILE từ bộ mô tả tệp?] (Http://stackoverflow.com/ Câu hỏi/1941464/cách-to-get-a-file-con trỏ-từ-một-tập-mô tả) –

Trả lời

168

Chức năng thích hợp là int fileno(FILE *stream). Nó có thể được tìm thấy trong <stdio.h> và là tiêu chuẩn POSIX nhưng không phải là tiêu chuẩn C.

+4

Nói đúng ra, sẽ không có bất kỳ cần phải đề cập đến bất kỳ tiêu đề hoặc thư viện nếu chức năng thực sự là một phần của tiêu chuẩn Thư viện C. Tuy nhiên, nó không phải là tiêu chuẩn, đó là lý do tại sao nó có thể làm cho tinh thần để đề cập đến tiêu đề ít nhất. – AnT

+16

Việc truy cập các hàm trong thư viện C chuẩn đòi hỏi phải bao gồm các tiêu đề, ít nhất nếu trình biên dịch của bạn mong đợi các nguyên mẫu (tôi không bao giờ nhớ hành vi tiêu chuẩn thực sự là gì). Không có tiêu đề, không có tên nào được định nghĩa ở đầu tệp C. – Novelocrat

+0

@Novelocrat: Tôi không có nghĩa là không cần phải có '# include' gì cả. Tôi chỉ có nghĩa là luôn luôn dễ dàng tìm thấy tên của tiêu đề thích hợp cho một chức năng * chuẩn *. I E. nó không thực sự quan trọng để đề cập đến tên tiêu đề chính xác trong câu trả lời. – AnT

27

Thậm chí nếu fileno(FILE *) có thể trả về bộ mô tả tệp, RẤT cẩn thận không bỏ qua bộ đệm của stdio. Nếu có dữ liệu đệm (đọc hoặc không ghi), việc đọc/ghi từ bộ mô tả tệp có thể cho bạn kết quả không mong muốn.

Để trả lời một trong những câu hỏi phụ, để chuyển đổi một bộ mô tả tập tin vào một con trỏ tập tin, dùng fdopen(3)

+0

Tôi không tin rằng điều này hữu ích cho những người tìm kiếm điều này một cách cụ thể và điều này đã được trả lời trong phần bình luận của bài đăng của OP một tháng trước khi bài viết này được viết. Đây là một sự làm rõ logic hơn là trái ngược với thông tin thực tế. – kevr