Saya ingin mengetahui perbedaan antara deskriptor file dan file pointer.
Juga, dalam skenario apa Anda akan menggunakan salah satu daripada yang lain?
c
file-descriptor
file-pointer
karthi_ms
sumber
sumber
Jawaban:
Deskriptor file adalah "pegangan" integer tingkat rendah yang digunakan untuk mengidentifikasi file yang dibuka (atau soket, atau apa pun) di tingkat kernel, di Linux dan sistem mirip Unix lainnya.
Anda meneruskan deskriptor file "polos" ke panggilan Unix yang sebenarnya, seperti
read()
,write()
dan sebagainya.Sebuah
FILE
pointer adalah konstruksi tingkat perpustakaan standar C, digunakan untuk merepresentasikan file. TheFILE
membungkus file descriptor, dan menambahkan buffering dan fitur lain untuk membuat I / O lebih mudah.Anda meneruskan
FILE
pointer ke fungsi C standar sepertifread()
danfwrite()
.sumber
fd
argumen pertama untukread()
. Mengapa Anda menyebutnya telanjang?FILE *
, deskriptor file integer adalah "kurang dibungkus", yaitu "telanjang".Salah satunya adalah buffered (
FILE *
) dan yang lainnya tidak. Dalam praktiknya, Anda ingin menggunakanFILE *
hampir selalu saat Anda membaca dari file 'asli' (yaitu di drive), kecuali Anda tahu apa yang Anda lakukan atau kecuali file Anda sebenarnya adalah soket atau lebih ..Anda bisa mendapatkan deskriptor file dari
FILE *
penggunaanfileno()
dan Anda bisa membuka bufferFILE *
dari deskriptor file menggunakanfdopen()
sumber
Deskriptor file hanyalah bilangan bulat yang Anda peroleh dari
open()
panggilan POSIX . Menggunakan standar Cfopen()
Anda mendapatkanFILE
struct kembali. TheFILE
struct berisi deskripsi file ini antara lain seperti akhir-of-file dan indikator kesalahan, posisi aliran dllJadi menggunakan
fopen()
memberi Anda sejumlah abstraksi dibandingkan denganopen()
. Secara umum Anda harus menggunakanfopen()
karena itu lebih portabel dan Anda dapat menggunakan semua fungsi C standar lainnya yang menggunakanFILE
struct, yaitu,fprintf()
dan keluarga.Tidak ada masalah kinerja saat menggunakannya.
sumber
Deskriptor file vs Penunjuk file
Deskriptor file:
File Descriptor adalah nilai integer yang dikembalikan oleh
open()
panggilan sistem.int fd = open (filePath, mode);
Penunjuk file:
Penunjuk File adalah penunjuk ke struktur C yang dikembalikan oleh
fopen()
fungsi pustaka, yang digunakan untuk mengidentifikasi file, membungkus deskriptor file, fungsi buffering, dan semua fungsi lain yang diperlukan untuk operasi I / O. Penunjuk file berjenis FILE , yang definisinya dapat ditemukan di "/usr/include/stdio.h" . Definisi ini mungkin berbeda dari satu kompilator ke kompiler lainnya.sumber
Ingin menambahkan poin yang mungkin berguna.
TENTANG
FILE *
Saya menggunakannya berkali-kali untuk log debug. contoh,
TENTANG
FILE DESCRIPTOR
Ini umumnya digunakan untuk IPC.
Memberikan kontrol tingkat rendah ke file di sistem * nix. (Perangkat, file, soket, dll), sehingga lebih kuat daripada
FILE *
.sumber
fdopen()
untuk melakukan hal-hal seperti IPC dan perangkat denganFILE*
?FILE*
, tetapi Anda dapat membuatFILE*
dari deskriptor file (fdopen()
) dan menutupnya nanti jugaFILE
akan menutup deskriptor. Oleh karena itu, Anda dapat melakukan IPC, tetapi Anda harus berurusan dengan deskriptor file sedikit untuk memfasilitasi IPC langsung.FILE *
lebih berguna ketika Anda bekerja dengan file teks dan user input / output, karena memungkinkan Anda untuk menggunakan fungsi API sepertisprintf()
,sscanf()
,fgets()
,feof()
dllAPI deskriptor file adalah level rendah, sehingga memungkinkan untuk bekerja dengan soket, pipa, file yang dipetakan memori (dan file biasa, tentu saja).
sumber
Sekadar catatan untuk menyelesaikan diskusi (jika tertarik) ....
fopen
bisa jadi tidak aman, dan Anda mungkin harus menggunakanfopen_s
atauopen
dengan kumpulan bit eksklusif. C1X menawarkanx
mode, sehingga Anda dapatfopen
dengan mode"rx"
,"wx"
, dllJika Anda menggunakan
open
, Anda mungkin mempertimbangkanopen(..., O_EXCL | O_RDONLY,... )
atauopen(..., O_CREAT | O_EXCL | O_WRONLY,... )
.Lihat, sebagai contoh, Jangan membuat asumsi tentang fopen () dan pembuatan file .
sumber
fopen_s
tampaknya tidak tersedia denganPOSIX
, saya berasumsi solusi yang paling portabel adalah untukopen(2)
dan kemudianfdopen(2)
. (menyisihkan jendela). Juga, apa yang lebih cepatfopen_s()
atauopen(2)
diikutifdopen(2)
?Panggilan sistem sebagian besar menggunakan deskriptor file, misalnya
read
danwrite
. Fungsi perpustakaan akan menggunakan penunjuk file (printf
,scanf
). Namun, fungsi perpustakaan hanya menggunakan panggilan sistem internal.sumber
Saya menemukan sumber daya yang bagus di sini , memberikan gambaran umum tingkat tinggi tentang perbedaan antara keduanya:
sumber