সি-তে কোনও ফাইল বর্ণনাকারীর (লিনাক্স) ফাইলের নাম পাওয়া সম্ভব?
সি-তে কোনও ফাইল বর্ণনাকারীর (লিনাক্স) ফাইলের নাম পাওয়া সম্ভব?
উত্তর:
আপনি ব্যবহার করতে পারেন readlink
উপর /proc/self/fd/NNN
যেখানে NNN ফাইল বর্ণনাকারী। এটি আপনাকে খোলার সময় ফাইলটির নাম দেবে - তবে, যদি ফাইলটি স্থানান্তরিত বা মুছে ফেলা হয় তবে এটি আর সঠিক হতে পারে না (যদিও লিনাক্স কিছু ক্ষেত্রে নামগুলি ট্র্যাক করতে পারে)। যাচাই করার জন্য, stat
দেওয়া ফাইলের নাম এবং fstat
আপনার কাছে থাকা এফডি, এবং নিশ্চিত করুন st_dev
এবংst_ino
একইরকম।
অবশ্যই, সমস্ত ফাইল বর্ণনাকারী ফাইলগুলিকে উল্লেখ করে না এবং তাদের জন্য আপনি কিছু বিজোড় পাঠ্য স্ট্রিং দেখতে পাবেন, যেমন pipe:[1538488]
। যেহেতু সমস্ত আসল ফাইলের নামগুলি পরম পাথ হবে, আপনি এটি নির্ধারণ করতে পারবেন যে এগুলি সহজেই যথেষ্ট। আরও, অন্যরা যেমন উল্লেখ করেছে যে ফাইলগুলিতে একাধিক হার্ডলিঙ্কগুলি তাদেরকে নির্দেশ করতে পারে - এটি কেবল এটির সাথে খোলার প্রতিবেদন করবে। আপনি যদি কোনও প্রদত্ত ফাইলের সমস্ত নাম সন্ধান করতে চান তবে আপনাকে কেবল পুরো ফাইল সিস্টেমটি অতিক্রম করতে হবে।
fd
যেমন একটি রেফারেন্স হবে), ইনড নম্বরটি পুনরায় ব্যবহার করা যাবে না । ফাইলটি বন্ধ হয়ে যাওয়ার পরে বা এটি খোলার আগে কোনও সফ্টওয়্যার একটি ইনোড নম্বর ব্যবহার করে যা সহজাতভাবে জাতি শর্তের সাপেক্ষে।
setuid()
কৌশল করেন তবে /proc/self/fd
আপনার প্রক্রিয়াটি অ্যাক্সেসযোগ্য না হওয়া সম্ভব। দেখুন: permalink.gmane.org/gmane.linux.kernel/1302546
ম্যাক ওএস এক্সে আমার এই সমস্যাটি ছিল We আমাদের /proc
ভার্চুয়াল ফাইল সিস্টেম নেই, তাই গৃহীত সমাধানটি কাজ করতে পারে না।
পরিবর্তে আমাদের F_GETPATH
জন্য একটি আদেশ আছে fcntl
:
F_GETPATH Get the path of the file descriptor Fildes. The argu-
ment must be a buffer of size MAXPATHLEN or greater.
সুতরাং কোনও ফাইল বর্ণনাকারীর সাথে সম্পর্কিত ফাইলটি পেতে, আপনি এই স্নিপেট ব্যবহার করতে পারেন:
#include <sys/syslimits.h>
#include <fcntl.h>
char filePath[PATH_MAX];
if (fcntl(fd, F_GETPATH, filePath) != -1)
{
// do something with the file path
}
যেহেতু কখনই MAXPATHLEN
সংজ্ঞায়িত হয় তা আমার মনে নেই, তাই ভেবেছিলাম PATH_MAX
সিস্টেমেটস থেকে ভাল হবে।
getsockname
।
উইন্ডোজ, এটি দিয়ে GetFileInformationByHandleEx , ক্ষণস্থায়ী FileNameInfo , আপনি ফাইলের নাম উদ্ধার করতে পারেন।
টাইলার যেমন উল্লেখ করেছেন, আপনার "প্রত্যক্ষ এবং নির্ভরযোগ্যভাবে" যা প্রয়োজন তা করার কোন উপায় নেই, যেহেতু প্রদত্ত এফডি 0 ফাইলের সাথে (বিভিন্ন ক্ষেত্রে) বা> 1 (একাধিক "হার্ড লিঙ্কগুলি" সম্পর্কিত হতে পারে তবে পরবর্তী পরিস্থিতিটি সাধারণত কীভাবে বর্ণনা করা হয় )। আপনি যদি এখনও (গতি উপর এবং পেয়ে 0, 2, ... ফলাফল বদলে 1 সম্ভাবনা দিকে) সব সীমাবদ্ধতার সঙ্গে কার্যকারিতা প্রয়োজন, এখানে কিভাবে আপনি এটা করতে পারেন: প্রথম, fstat এফডি - এই আপনি বলে , ফলস্বরূপstruct stat
, ফাইলটি কোন ডিভাইসে বাস করে, এর মধ্যে কতগুলি হার্ড লিঙ্ক রয়েছে, এটি কোনও বিশেষ ফাইল রয়েছে কিনা ইত্যাদি already এটি ইতিমধ্যে আপনার প্রশ্নের উত্তর দিতে পারে - উদাহরণস্বরূপ যদি 0 হার্ড লিঙ্কগুলি আপনি জানেন তবে বাস্তবে কোনও ফাইলের নাম নেই ডিস্কে
যদি পরিসংখ্যানগুলি আপনাকে প্রত্যাশা দেয়, তবে আপনাকে সমস্ত হার্ড লিঙ্কগুলি না পাওয়া অবধি আপনার প্রাসঙ্গিক ডিভাইসের ডিরেক্টরিতে "গাছের সাথে হাঁটাচলা" করতে হবে (বা কেবলমাত্র প্রথমটি, যদি আপনার একের বেশি প্রয়োজন না হয় এবং যে কোনও একটি করবে না )। যে উদ্দেশ্যে, যদি আপনি ব্যবহার দ্বারা readdir (এবং opendir & অবশ্যই গ) যাও recursively সাবডিরেক্টরি খোলার পর্যন্ত আপনি একটি খুঁজে struct dirent
এইভাবে পেয়েছি একই inode সংখ্যা আপনি মূল ছিলstruct stat
(যা সময়ে গোটা পাথ চান, বরং নাম চেয়ে, এটি পুনর্গঠন করার জন্য আপনাকে ডিরেক্টরিগুলির চেইনটি পিছনের দিকে যেতে হবে)।
যদি এই সাধারণ পদ্ধতির গ্রহণযোগ্য হয় তবে আপনার আরও বিস্তারিত সি কোডের দরকার আছে, আমাদের জানান, এটি লিখতে অসুবিধা হবে না (যদিও এটি অকেজো হয়ে থাকলে আমি এটি লিখি না, অর্থাত্ আপনি অনিবার্যভাবে ধীর পারফরম্যান্স বা প্রতিরোধ করতে পারবেন না) আপনার আবেদনের উদ্দেশ্যে; = 1 ফলাফল পাওয়ার সম্ভাবনা ;-)।
স্ট্রাক স্ট্যাটাস দ্বারা ফাইলের ইনোড পেতে আপনি fstat () ব্যবহার করতে পারেন। তারপরে, রিডডির () ব্যবহার করে আপনি যে ডিরেক্টরি খুঁজে পেয়েছেন তাদের সাথে (স্ট্রাক্ট ডাইরেক্ট) আপনি যে ইনোডটি পেয়েছেন তার সাথে তুলনা করতে পারেন (ধরে নিচ্ছেন যে ডিরেক্টরিটি আপনি জানেন, অন্যথায় আপনাকে পুরো ফাইল সিস্টেমটি অনুসন্ধান করতে হবে) এবং সংশ্লিষ্ট ফাইলটির নামটি সন্ধান করতে পারেন। কদর্য?
অসম্ভব। একটি ফাইল বর্ণনাকারীর ফাইল সিস্টেমে একাধিক নাম থাকতে পারে, বা এর কোনও নামই থাকতে পারে।
সম্পাদনা: ধরে নিই যে আপনি কোনও ওএস নির্দিষ্ট না করায় কোনও ওএস-নির্দিষ্ট এপিআই ছাড়াই আপনি একটি সরল পুরাতন পসিক্স সিস্টেমের বিষয়ে কথা বলছেন।