Bagaimana saya bisa mengkonversi file pointer (FILE * fp) ke deskriptor file (int fd)?

174

Saya punya FILE *, dikembalikan melalui telepon ke fopen(). Saya perlu mendapatkan deskriptor file darinya, untuk melakukan panggilan seperti fsync(fd)itu. Apa fungsi untuk mendapatkan deskriptor file dari penunjuk file?

Phil Miller
sumber
Atau Anda dapat membuka file dengan open (2), dan Anda akan memiliki deskriptor file dari awal
Antoine Pelisse

Jawaban:

214

Fungsi yang tepat adalah int fileno(FILE *stream). Itu dapat ditemukan di <stdio.h>, dan merupakan standar POSIX tetapi bukan standar C.

Phil Miller
sumber
4
Sebenarnya, tidak perlu menyebutkan header atau pustaka jika fungsi tersebut memang merupakan bagian dari pustaka C standar. Namun, ini bukan standar, itulah sebabnya mengapa masuk akal untuk menyebutkan setidaknya header.
AnT
20
Mengakses fungsi dalam pustaka C standar memang membutuhkan header, setidaknya jika kompiler Anda mengharapkan prototipe (saya tidak pernah ingat apa sebenarnya perilaku standar dalam hal itu). Tanpa tajuk, tidak ada nama yang ditentukan di awal file C.
Phil Miller
1
@Novelocrat: Saya tidak bermaksud bahwa tidak perlu #includeapa - apa. Saya hanya bermaksud bahwa selalu mudah untuk menemukan nama header yang tepat untuk fungsi standar . Yaitu tidak benar-benar kritis untuk menyebutkan nama header yang tepat dalam jawabannya.
AnT
9
Ini adalah jawaban yang baik, tetapi perlu dicatat bahwa ini bukan fungsi standar c, ini adalah fungsi posix.
Evan Teran
6
Itu tidak dalam standar C, karena deskriptor file adalah hal UNIX (di Linux, itu terbuka (2), tidak terbuka (3)).
bukan pengguna
42

Bahkan jika fileno(FILE *)dapat mengembalikan deskriptor file, berhati-hatilah untuk tidak melewati buffer stdio. Jika ada data buffer (baik baca atau tulis tidak rata), membaca / menulis dari deskriptor file mungkin memberi Anda hasil yang tidak terduga.

Untuk menjawab salah satu pertanyaan samping, untuk mengonversi deskriptor file ke pointer FILE, gunakan fdopen(3)

Mark Gerolimatos
sumber
1
Saya tidak percaya ini bermanfaat bagi orang yang mencari ini secara khusus, dan ini sudah dijawab di bagian komentar pada posting OP sebulan sebelum ini ditulis. Ini lebih merupakan klarifikasi logika yang bertentangan dengan informasi nyata.
kevr
4
Komentar yang sangat penting perlu diangkat sebagai jawaban. Sebagian besar komentar adalah metacomment yang tajam dan tidak berguna seperti milik Anda ... dan yang ini;)
Mark Gerolimatos