& 6 এবং / dev / fd / 6 এর মধ্যে পার্থক্য কী?


11

ফাইল বর্ণনাকারী থেকে 6 পড়তে আমি ব্যবহার করতে পারি <&6বা </dev/fd/6(ওরফে /proc/self/fd/6)। সাধারণত উভয়ই সমানভাবে ভাল কাজ করে। তবে যদি সেই ফাইল বর্ণনাকারীটিকে সকেট হিসাবে দেখা দেয় তবে অদ্ভুত জিনিস ঘটে। উদাহরণ স্বরূপ:

$ bash -c 'ls -l /dev/fd/6;cat /dev/fd/6' 6</dev/tcp/localhost/12345
lrwx------ 1 michas michas 64 Jan 10 19:50 /dev/fd/6 -> socket:[315010]
cat: /dev/fd/6: No such device or address

এখানে lsবর্ণনাকারী প্রকৃতপক্ষে উপস্থিত দেখায়। তবে ডেটা অ্যাক্সেস করা এইভাবে সম্ভব নয়। আমি যদি cat <&6পরিবর্তে ব্যবহার করি তবে সবকিছু আবার ভালভাবে কাজ করে।

ফাইল বর্ণনাকারী অ্যাক্সেস করার উভয় পদ্ধতির মধ্যে পার্থক্য কী?

কোনও ভেরিয়েবলটিতে যদি নম্বর দেওয়া হয় তবে কি কোনও বিবরণকারীকে অ্যাক্সেস করার ভাল উপায় আছে? ( </dev/fd/$fdকাজ করবে, কিন্তু কাজ <&$fdকরে না))

(উপরের পরিস্থিতি লিনাক্সে লক্ষ্য করা যায় তবে ওপেনবিএসডি-তে নয় - ফাইল বর্ণনাকারী মনে হয় সেখানে নিয়মিত চরিত্রের ডিভাইস রয়েছে।)


1
এটি কি একটি অনুলিপি করা হয়েছে unix.stackexchange.com/q/98958/38906
cuonglm

2
ধন্যবাদ। এটি সম্পর্কিত তবে সত্যই কোনও সদৃশ নয়।
মিচাস

উত্তর:


5

এটি তাই কারণ /dev/fd/সকেটগুলির প্রতিনিধিত্বকারী এন্ট্রিগুলি থেকে পড়া লিনাক্সে প্রয়োগ করা হয়নি। আপনি এখানে যুক্তি উপর একটি ভাল লেখার সন্ধান করতে পারেন। সুতরাং আপনি statলিঙ্কটিতে কল করতে পারেন এবং এজন্যই আপনি এটি দেখতে পাচ্ছেন ls, তবে অ্যাক্সেস ইচ্ছাকৃতভাবে অনুমোদিত নয়।

এখন দ্বিতীয় অংশের জন্য - কেন bash -c 'ls -l /dev/fd/6; cat <&6' 6</dev/tcp/localhost/12345কাজ করে? এর কারণ সকেট ফাইল /procসিস্টেম নয়, সকেট / ফাইল এপিআই ব্যবহার করা থেকে পড়ে । এটিই আমি ঘটতে দেখেছি:

  1. bash আপনার টার্মিনালে চলমান উদাহরণস্বরূপ fd 6 দিয়ে সকেট তৈরি করে।
  2. শিশু bashরান এবং কলের dup2(6, 0)যাতে হিসাবে আপনার সকেট সংযুক্ত করার জন্য cat'র stdin
  3. যদি dup2কল ব্যর্থ না হয়, বিড়ালটি পড়ে stdin

আপনি এটিকে পুনরুত্পাদন এবং পর্যবেক্ষণ করতে পারেন:

netcat -lp 12345    # in another terminal session (GNU netcat)
strace -f -e trace=open,read,write,dup2 bash -c 'ls -l /dev/fd/6; cat <&6' \
 6</dev/tcp/localhost/12345

যদি আপনি ভাবছেন যে কেন bashশিশু প্রক্রিয়াটিতে এফডি 6 - ফাইলের বর্ণনাকারীরা বেঁচে থাকতে পারে forkএবং যদি তাদের বন্ধ করার জন্য চিহ্নিত না করা হয় তবে তারা execসেখানেও বন্ধ হয় না।


3

আপনার সরাসরি প্রশ্নের উত্তর দিতে, " পার্থক্য কী?":

আপনি যখন থেকে পুনর্নির্দেশ করেন <&6, শেলটি dup2()ফাইল বর্ণনাকারীর সদৃশ করতে একটি সিস্টেম কল ব্যবহার করে। আপনি যখন থেকে পুনঃনির্দেশ করার চেষ্টা করবেন তখন </dev/fd/6এটি ব্যবহার করবে open()

কার্নেলটি open()সকেটগুলিতে সমর্থন করে না /dev/fd; তারা কেবল সজ্জা সম্পর্কিত তথ্যের জন্য ডিরেক্টরিতে উপস্থিত থাকে ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.