Làm cách nào tôi có thể chuyển đổi một con trỏ tệp (FILE * fp) thành một mô tả tệp (int fd)?


174

Tôi có một FILE *, trả lại bởi một cuộc gọi đến fopen(). Tôi cần lấy 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 nó. Chức năng để có được một mô tả tập tin từ một con trỏ tập tin là gì?


Hoặc bạn có thể mở tệp với mở (2) và bạn sẽ có một bộ mô tả tệp ngay từ đầu
Antoine Pelisse

Câu trả lời:


214

Các 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à một 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ần phải đề cập đến bất kỳ tiêu đề hoặc thư viện nào nếu chức năng thực sự là một phần của thư viện C tiêu chuẩn. Tuy nhiên, nó không phải là tiêu chuẩn, đó là lý do tại sao nó có thể có ý nghĩa để đề cập đến tiêu đề ít nhất.
AnT

20
Truy cập các chức năng trong thư viện C tiêu chuẩn yêu cầu bao gồm các tiêu đề, ít nhất là 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ớ những gì thực sự là hành vi tiêu chuẩn trong khía cạnh đó). Không có tiêu đề, không có tên được xác định ở đầu tệp C.
Phil Miller

1
@Nigsocrat: Tôi không có nghĩa là không cần #includebất cứ điều gì. 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 tiêu chuẩn . Tức là 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

9
Đây là một câu trả lời tốt, nhưng đáng chú ý rằng đây không phải là một hàm c tiêu chuẩn, nó là một hàm posix.
Evan Teran

6
Nó không nằm trong tiêu chuẩn C, vì các bộ mô tả tệp là một thứ UNIX (trên Linux, nó là mở (2), không mở (3)).
không phải người dùng

42

Ngay cả khi fileno(FILE *)có thể trả về một bộ mô tả tệp, hãy cẩn thận để không bỏ qua bộ đệm của stdio. Nếu có dữ liệu đệm (ghi hoặc đọc không ghi), đọ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 thành một con trỏ TẬP_TIN, hãy sử dụng fdopen(3)


1
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 viết của OP một tháng trước khi nó được viết. Đây là nhiều hơn một sự làm rõ logic trái ngược với thông tin thực tế.
kevr

4
Những bình luận rất quan trọng cần được nêu lên như câu trả lời. Một tỷ lệ lớn các bình luận là
lén lút
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.