GNU/Linux >> Belajar Linux >  >> Linux

Ambil nama file dari deskriptor file di C

Saya mengalami masalah ini di Mac OS X. Kami tidak memiliki /proc sistem file virtual, sehingga solusi yang diterima tidak dapat berfungsi.

Sebaliknya, kami memiliki F_GETPATH perintah untuk fcntl :

 F_GETPATH          Get the path of the file descriptor Fildes.  The argu-
                    ment must be a buffer of size MAXPATHLEN or greater.

Jadi untuk mendapatkan file yang terkait dengan deskriptor file, Anda dapat menggunakan cuplikan ini:

#include <sys/syslimits.h>
#include <fcntl.h>

char filePath[PATH_MAX];
if (fcntl(fd, F_GETPATH, filePath) != -1)
{
    // do something with the file path
}

Karena saya tidak pernah ingat di mana MAXPATHLEN didefinisikan, saya pikir PATH_MAX dari syslimits akan baik-baik saja.


Anda dapat menggunakan readlink pada /proc/self/fd/NNN di mana NNN adalah deskriptor file. Ini akan memberi Anda nama file seperti saat dibuka - namun, jika file dipindahkan atau dihapus sejak saat itu, itu mungkin tidak lagi akurat (walaupun Linux dapat melacak penggantian nama dalam beberapa kasus). Untuk memverifikasi, stat nama file yang diberikan dan fstat fd yang Anda miliki, dan pastikan st_dev dan st_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. Selanjutnya, seperti yang telah dicatat orang lain, file dapat memiliki beberapa hardlink yang menunjuk ke file tersebut - ini hanya akan melaporkan file yang dibuka. Jika Anda ingin menemukan semua nama untuk file tertentu, Anda hanya perlu menjelajahi seluruh sistem file.


Seperti yang ditunjukkan Tyler, tidak ada cara untuk melakukan apa yang Anda butuhkan "secara langsung dan andal", karena FD yang diberikan mungkin sesuai dengan 0 nama file (dalam berbagai kasus) atau> 1 (beberapa "tautan keras" adalah bagaimana situasi terakhir umumnya dijelaskan. ). Jika Anda masih membutuhkan fungsionalitas dengan semua keterbatasan (pada kecepatan DAN pada kemungkinan mendapatkan hasil 0, 2, ... daripada 1), inilah cara Anda dapat melakukannya:pertama, fstat FD - ini memberi tahu Anda , dalam struct stat yang dihasilkan , di perangkat apa file itu 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 pada 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 siapa pun akan melakukannya ). Untuk tujuan itu, Anda menggunakan readdir (dan opendir &c tentu saja) membuka subdirektori secara rekursif sampai Anda menemukan di struct dirent dengan demikian menerima nomor inode yang sama dengan yang Anda miliki di struct stat asli (pada saat itu jika Anda menginginkan seluruh jalur, bukan hanya namanya, Anda harus menelusuri rantai direktori ke belakang untuk merekonstruksinya).

Jika pendekatan umum ini dapat diterima, tetapi Anda memerlukan kode C yang lebih detail, beri tahu kami, tidak akan sulit untuk menulisnya (walaupun saya lebih suka tidak menulisnya jika tidak berguna, yaitu Anda tidak dapat menahan kinerja lambat yang pasti atau kemungkinan mendapatkan hasil !=1 untuk keperluan aplikasi Anda;-).


Di Windows, dengan GetFileInformationByHandleEx, meneruskan FileNameInfo, Anda dapat mengambil nama file.


Linux
  1. Bagaimana Cara Cat File Dari Awk?

  2. Membaca dari file dalam perakitan

  3. Cara mengekstrak file nama file.tar.gz

  1. Buat PEM dari file PPK

  2. Bagaimana install -c berbeda dari cp

  3. Bagaimana cara mengambil informasi file video dari baris perintah di Linux?

  1. Portabilitas Tautan File Descriptor?

  2. Awk Dari Baris Yang Berbeda?

  3. Perintah Linux untuk mengambil rentang byte dari file