Apakah mungkin untuk mendapatkan nama file dari deskriptor file (Linux) di C?
c
linux
file
file-descriptor
adk
sumber
sumber
Jawaban:
Anda dapat menggunakan
readlink
di/proc/self/fd/NNN
mana NNN adalah deskriptor file. Ini akan memberi Anda nama file seperti saat dibuka - namun, jika file dipindahkan atau dihapus sejak saat itu, mungkin tidak lagi akurat (meskipun Linux dapat melacak penggantian nama dalam beberapa kasus). Untuk memverifikasi,stat
nama file yang diberikan danfstat
fd yang Anda miliki, dan pastikanst_dev
danst_ino
sama.Tentu saja, tidak semua deskriptor file merujuk ke file, dan untuk itu Anda akan melihat beberapa string teks yang aneh, seperti
pipe:[1538488]
. Karena semua nama file asli akan menjadi jalur absolut, Anda dapat menentukan mana yang cukup mudah. Lebih lanjut, seperti yang diketahui orang lain, file dapat memiliki beberapa hardlink yang mengarah ke mereka - ini hanya akan melaporkan hardlink yang dibukanya. Jika Anda ingin mencari semua nama untuk file tertentu, Anda hanya perlu melintasi seluruh sistem file.sumber
fd
akan menjadi referensi seperti itu), nomor inode tidak dapat digunakan kembali. Perangkat lunak apa pun yang menggunakan nomor inode setelah menutup file atau sebelum membukanya tunduk pada ketentuan balapan.setuid()
trik, mungkin saja/proc/self/fd
tidak dapat diakses oleh proses Anda. Lihat: permalink.gmane.org/gmane.linux.kernel/1302546Saya mengalami masalah ini di Mac OS X. Kami tidak memiliki
/proc
sistem file virtual, jadi solusi yang diterima tidak dapat berfungsi.Kami, sebaliknya, memiliki
F_GETPATH
perintah untukfcntl
:Jadi untuk mendapatkan file yang terkait dengan deskriptor file, Anda dapat menggunakan cuplikan ini:
Karena saya tidak pernah ingat di mana
MAXPATHLEN
didefinisikan, saya pikirPATH_MAX
dari syslimits akan baik-baik saja.sumber
getsockname
.Di Windows, dengan GetFileInformationByHandleEx , meneruskan FileNameInfo , Anda dapat mengambil nama file.
sumber
Seperti yang ditunjukkan Tyler, tidak ada cara untuk melakukan apa yang Anda perlukan "secara langsung dan andal", karena FD tertentu mungkin sesuai dengan 0 nama file (dalam berbagai kasus) atau> 1 (beberapa "tautan keras" adalah bagaimana situasi yang terakhir ini umumnya dijelaskan ). Jika Anda masih membutuhkan fungsionalitas dengan semua batasan (pada kecepatan DAN kemungkinan mendapatkan hasil 0, 2, ... daripada 1), berikut cara melakukannya: pertama, fstat FD - ini memberi tahu Anda , pada
struct stat
perangkat apa file tersebut berada, berapa banyak tautan keras yang dimilikinya, apakah itu file khusus, dll. Ini mungkin sudah menjawab pertanyaan Anda - mis. jika 0 tautan keras Anda akan TAHU sebenarnya tidak ada nama file yang sesuai di disk.Jika statistik memberi Anda harapan, maka Anda harus "berjalan di pohon" direktori pada perangkat yang relevan sampai Anda menemukan semua tautan keras (atau hanya yang pertama, jika Anda tidak membutuhkan lebih dari satu dan salah satu akan melakukannya ). Untuk tujuan itu, Anda menggunakan readdir (dan opendir & c tentu saja) membuka subdirektori secara rekursif sampai Anda menemukan
struct dirent
inode yang menerima nomor inode yang sama dengan yang Anda miliki di aslinyastruct stat
(pada saat itu jika Anda menginginkan seluruh jalur, bukan hanya namanya, Anda harus berjalan ke belakang rantai direktori untuk merekonstruksinya).Jika pendekatan umum ini dapat diterima, tetapi Anda memerlukan kode C yang lebih rinci, beri tahu kami, ini tidak akan sulit untuk menulis (meskipun saya lebih suka tidak menulisnya jika tidak berguna, yaitu Anda tidak dapat menahan kinerja lambat yang tak terelakkan atau kemungkinan mendapatkan! = 1 hasil untuk keperluan aplikasi Anda ;-).
sumber
Sebelum menulis ini karena tidak mungkin, saya sarankan Anda melihat kode sumber dari perintah lsof .
Mungkin ada batasan tetapi lsof tampaknya mampu menentukan deskriptor file dan nama file. Informasi ini ada di filesystem / proc sehingga dapat diakses dari program Anda.
sumber
Anda bisa menggunakan fstat () untuk mendapatkan inode file dengan status struct. Kemudian, menggunakan readdir () Anda dapat membandingkan inode yang Anda temukan dengan yang ada (struct dirent) di direktori (dengan asumsi Anda mengetahui direktori tersebut, jika tidak Anda harus mencari seluruh sistem file) dan menemukan nama file yang sesuai. Menjijikan?
sumber
Mustahil. Deskriptor file mungkin memiliki banyak nama dalam sistem file, atau mungkin tidak memiliki nama sama sekali.
Edit: Dengan asumsi Anda berbicara tentang sistem POSIX lama biasa, tanpa API khusus OS, karena Anda tidak menentukan OS.
sumber