প্রতিটি প্রক্রিয়ার একটি বর্তমান ডিরেক্টরি রয়েছে এর অর্থ কী?


10

আমি "দ্য ইউনিক্স প্রোগ্রামিং পরিবেশ" পড়ছি, তবে আমি প্রক্রিয়াটির বর্তমান ডিরেক্টরিটি উপলব্ধি করতে পারি না ।

প্রতিটি প্রক্রিয়াটির একটি বর্তমান ডিরেক্টরি রয়েছে এবং সমস্ত ফাইলের নাম অবশ্যই ডিরেক্টরিটির নাম দিয়ে শুরু করা হয়, যদি না তারা সরাসরি স্ল্যাশ দিয়ে শুরু করে।

এর অর্থ কি এই যে প্রতিটি প্রক্রিয়াতে কোন ডিরেক্টরিতে এটি তৈরি করা হয়েছিল তাতে একটি চিহ্ন রয়েছে? উদাহরণস্বরূপ, যদি প্রোগ্রামটি /bin/sedআহ্বান করা হয় /home/rene, তবে যে প্রক্রিয়াটি চালানো থেকে তৈরি হয়েছিল সেগুলির বর্তমান ডিরেক্টরি রয়েছে /home/rene?

উত্তর:


13

ধারণাগত স্তর

আপনি যখন শেল থেকে কোনও প্রক্রিয়া শুরু করেন, প্রক্রিয়াটির বর্তমান কার্যক্ষম ডিরেক্টরিটি আপনার শেলের বর্তমান কার্যক্ষম ডিরেক্টরি হিসাবে একই। শেলটির প্রসঙ্গে, বর্তমান কার্যক্ষম ডিরেক্টরিটি আপনি বর্তমানে "অবস্থিত" অবস্থান "

যে কোনও প্রক্রিয়ার বর্তমান চলমান ডিরেক্টরি আপেক্ষিক পাথের ব্যাখ্যার জন্য ব্যবহৃত হয়। উদাহরণস্বরূপ, যদি আপনার শেলের বর্তমান ওয়ার্কিং ডিরেক্টরিটি ছিল /home/reneএবং আপনি ls ..শেল থেকে ছুটে এসেছিলেন , প্রক্রিয়াটির বর্তমান ওয়ার্কিং ডিরেক্টরিটি /home/reneএটি সমাধান ..করার জন্য ব্যবহৃত হত /home

আপনি আপনার সিস্টেমে চলমান সমস্ত প্রক্রিয়াটির বর্তমান কার্যকরী ডিরেক্টরিগুলি দেখতে পাচ্ছেন lsof | grep '\scwd\s'(নোট করুন যে অন্য ব্যবহারকারীদের প্রক্রিয়াগুলি দেখার জন্য আপনাকে সম্ভবত মূল হতে হবে।) এটি আপনাকে বর্তমান কার্য ডিরেক্টরিগুলি কীভাবে সম্পর্কিত তার একটি ধারণা দিতে পারে আপনার সিস্টেমে প্রক্রিয়াগুলি চলছে।

প্রোগ্রাম স্তর

শেলের সাম্প্রতিক কাজ করা ডিরেক্টরি আপনি দেখতে এবং শেল বিল্ট-ইন সঙ্গে সংশোধন হয় pwdএবং cdযথাক্রমে। এই কমান্ডগুলি কল সিস্টেম কল যেমন getcwdএবং chdirএটি আপনার শেলের বর্তমান কার্যকরী ডিরেক্টরিতে কাজ করে।

bashউদাহরণ হিসাবে ব্যবহার করে , cdঅন্তর্নির্মিত অবশেষে এই লাইনটি চালায়:

if (chdir (nolinks ? newdir : tdir) == 0)

এবং pwdঅন্তর্নির্মিত অবশেষে এই লাইনটি চালায়:

the_current_working_directory = getcwd (0, PATH_MAX);

শেলটি বর্তমান চলমান ডিরেক্টরি ডিরেক্টরি ব্যবহারের একটি সুবিধাজনক উদাহরণ; এই একই সিস্টেম কলগুলি অন্যান্য প্রোগ্রামগুলিও ব্যবহার করে। একটি প্রোগ্রাম তার বর্তমান চলমান ডিরেক্টরিটি পরিবর্তন করতে পারে /usrএবং প্রোগ্রামটি যে কোনও আপেক্ষিক পাথ ব্যবহার করে তা /usrডিরেক্টরি থেকে শুরু হবে ,

কার্নেল স্তর

প্রক্রিয়াটির বর্তমান কার্যকারী ডিরেক্টরি কার্নেল দ্বারা সংরক্ষণ করা হয়। লিনাক্স এটা সঞ্চয় করে pwdএকটি সদস্য fs_structদ্বারা সরু fsএকটি সদস্য task_structpwdসদস্য হয় pathstruct হয়, যা মাউন্ট সম্বন্ধে তথ্যে পয়েন্ট ( vfsmount) এবং ফাইলসিস্টেম ডিরেক্টরিতে এর অবস্থান ( dentry)। প্রতিটি প্রক্রিয়া এর task_structসাথে যুক্ত থাকে।

chdirএবং getcwdসিস্টেম কল সংশোধন এবং তথ্য পুনরুদ্ধার pwd


অতিরিক্তভাবে, কার্নেল স্তরের জন্য এটি মনে রাখা দরকারী যে যখন কোনও সিস্টেম কল করা হয় তখন 'কারেন্ট' টাস্ক_স্ট্রিক্টের জন্য একটি পয়েন্টার পাওয়া যায় - সুতরাং 'বর্তমান প্রক্রিয়াটির পক্ষে কোডটি কার্যকর করা হয়'। fs_struct বর্তমান টাস্ক_স্ট্রাক্টের পয়েন্টারের মাধ্যমে অ্যাক্সেস করা যায়: elixir.free-electrons.com/linux/v4.12.4/source/fs/…
দিমিত্রি এস

1

প্রতিটি প্রক্রিয়াটির একটি বর্তমান ওয়ার্কিং ডিরেক্টরি (সিডাব্লুডি) থাকে যা এটি শুরু হওয়ার পরে নির্ধারিত হয়। একটি প্রক্রিয়াটির জন্য ওয়ার্কিং ডিরেক্টরিটি অনুসন্ধান করতে আপনি নিম্নলিখিতটি করতে পারেন।

কোনও প্রক্রিয়ার পিআইডি জানতে পিএস অক্স চালান:

$ pgrep cupsd
24532

একটি পিআইডি বর্তমান ওয়ার্কিং ডিরেক্টরি খুঁজে পেতে: 24532

$ sudo pwdx 24532
24532: /

প্রক্রিয়া যাতে (PID,: 24532) এর CWD হয়েছে /

এখানে অন্য একটি উদাহরণ:

$ sleep 1000 &
[1] 15988

$ pwdx 15988
15988: /home/sam

এবার ঘুম প্রক্রিয়াটির (পিআইডি: 15988) এটি আমার হোম ডিরেক্টরিতে সিডাব্লুডি সেট করেছে /home/sam,।

আপনি ls -lকমান্ডটি চালাতে পারেন :

$ sudo ls -l /proc/24532/cwd
lrwxrwxrwx 1 root root 0 Apr 30 19:18 /proc/24532/cwd -> /

-অথবা-

$ ls -l /proc/15988/cwd
lrwxrwxrwx 1 sam sam 0 Apr 30 19:23 /proc/15988/cwd -> /home/sam

এখানে আপনি আবার সেই প্রক্রিয়াগুলির জন্য CWD দেখতে পাবেন, /এবং /home/sam

তথ্যসূত্র

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