কোন ফাইল বর্ণনাকারী একই "ওপেন ফাইলের বিবরণ" ভাগ করে তা সন্ধান করুন


17

যদি আমি (বোর্নের মতো শেল) করি:

exec 3> file 4>&3 5> file 6>> file

ফাইল বর্ণনাকারী 3 এবং 4, যেহেতু 4 টি dup()3 থেকে সম্পাদনা করা হয়েছিল , একই খোলা ফাইলের বিবরণটি ভাগ করুন (একই বৈশিষ্ট্য, ফাইলের মধ্যে একই অফসেট ...)। এই প্রক্রিয়াটির 5 এবং 6 ফাইল বর্ণনাকারীরা যখন আলাদা ফাইলের বিবরণে থাকে (উদাহরণস্বরূপ, ফাইলগুলির মধ্যে তাদের প্রত্যেকের নিজস্ব পয়েন্টার রয়েছে)।

এখন, lsofআউটপুটে, আমরা যা দেখছি তা হ'ল:

zsh     21519 stephane    3w   REG  254,2        0 10505865 /home/stephane/file
zsh     21519 stephane    4w   REG  254,2        0 10505865 /home/stephane/file
zsh     21519 stephane    5w   REG  254,2        0 10505865 /home/stephane/file
zsh     21519 stephane    6w   REG  254,2        0 10505865 /home/stephane/file

এটি দিয়ে কিছুটা ভাল lsof +fg:

zsh     21519 stephane    3w   REG          W,LG  254,2        0 10505865 /home/stephane/file
zsh     21519 stephane    4w   REG          W,LG  254,2        0 10505865 /home/stephane/file
zsh     21519 stephane    5w   REG          W,LG  254,2        0 10505865 /home/stephane/file
zsh     21519 stephane    6w   REG       W,AP,LG  254,2        0 10505865 /home/stephane/file

(এখানে লিনাক্স ৩.১16 এ) আমরা দেখতে পাচ্ছি যে এফডি এর আলাদা আলাদা পতাকা রয়েছে, সুতরাং এটি এফডি 3, 4 বা 5 এর চেয়ে আলাদা একটি ফাইলের বিবরণ হতে হবে, তবে এটি থেকে আমরা fd 5 বলতে পারি না বিভিন্ন ওপেন ফাইল বিবরণ । এর সাথে -o, আমরা অফসেটটিও দেখতে পেতাম, তবে আবার একই অফসেটটি এটির একই খোলার ফাইল বিবরণের গ্যারান্টি দেয় না ।

এটি খুঁজে পাওয়ার জন্য কোনও অ-অনুপ্রবেশকারী 1 উপায় আছে? বাহ্যিকভাবে, বা কোনও প্রক্রিয়াটির জন্য নিজস্ব ফাইল বর্ণনাকারী?


। একটি হিউরিস্টিক পদ্ধতির মাধ্যমে একটি এফডির পতাকা পরিবর্তন করা fcntl()এবং ফলস্বরূপ অন্যান্য ফাইল বর্ণনাকারীরা তাদের পতাকাগুলি কীভাবে আপডেট করেছে তা দেখতে পাওয়া যায়, তবে এটি অবশ্যই আদর্শ বা বোকা প্রমাণ নয়


এই পদ্ধতির নীতিগতভাবে কাজ করা উচিত, এবং বেশিরভাগ পরিস্থিতিতে খুব বেশি বিঘ্নিত হওয়া উচিত নয়: প্রথমে একটি শিশুকে কাঁটাচামচ করুন (বাইরে থেকে যদি তা করে থাকেন তবে) তারপরে, সন্তানের মধ্যে, ফাইল বর্ণনাকারী দিয়ে এমন কিছু করুন যা অন্য প্রক্রিয়াগুলিকে প্রভাবিত করে না। লিনাক্সে, ইজারাগুলি এর জন্য কাজ করা উচিত।
গিলস

@ গিলিস, ধন্যবাদ তবে আমি ইতিমধ্যে প্রশ্নটিতে প্রস্তাবিত পদ্ধতির কম-বেশি। ইজারা (ধরে নিচ্ছেন আপনি F_SETLEASE fcntl বোঝাতে চাইছেন, আমাকে বিটিডব্লিউ সম্পর্কে তাদের সচেতন করার জন্য ধন্যবাদ) কেবলমাত্র আপনার নিজের নিয়মিত ফাইলগুলির জন্য কাজ করবে এবং যদি একই ফাইলটিতে অন্য কোনও "লিখন" ফাইলের বিবরণ (EBUSY) না থাকে, এবং এটি হুবহু নয় -intrusive।
স্টাফেন চেজেলাস

আপনি এই প্রশ্ন ত্যাগ করেছেন? সিস্টেমট্যাপ যা চাইলে কীভাবে করতে পারে সে সম্পর্কিত আমি কিছু তথ্য পোস্ট করেছি, তবে আপনি কোনও উত্তর সম্পূর্ণ হিসাবে চিহ্নিত করেন নি ...?
আজরেই

উত্তর:


2

লিনাক্স 3.5 এবং এর পরে, কেসিএমপি (3) দিয়ে এটি সম্পন্ন করা যেতে পারে :

KCMP_FILE

  • প্রক্রিয়া পিড 1- তে কোনও ফাইল বর্ণনাকারী idx1 একই প্রক্রিয়া পিড 2-তে ফাইল ডেস্ক্রিপ্টর আইডিএক্স 2 হিসাবে একই উন্মুক্ত ফাইলের বর্ণন ( ওপেন (2) দেখুন ) কিনা তা পরীক্ষা করুন । একই ফাইলের বর্ণনা হিসাবে উল্লিখিত দুটি ফাইল বর্ণনাকারীর অস্তিত্ব ডুপ (2) (এবং অনুরূপ) কাঁটাচামচ (2) এর ফলে বা ডোমেন সকেটের মাধ্যমে ফাইল বর্ণনাকারী ( ইউনিক্স (7) দেখুন ) এর ফলে ঘটতে পারে ।

ওপেন জিজ্ঞাসা করা ব্যবহারের ক্ষেত্রে ম্যান পৃষ্ঠাটি একটি উদাহরণ দেয়। মনে রাখবেন যে এই সিস্টেমে কার্নেলটি CONFIG_CHECKPOINT_RESTOREসেট দিয়ে সংকলিত করা দরকার ।


ধন্যবাদ। ঠিক আমি যা খুঁজছিলাম। দ্রষ্টব্য যে আপনি সুপারইজার না হলে এটি আপনার দুটি প্রক্রিয়া হতে হবে (এবং সেটুয়েড / সেটগিড হবে না ...) (বোধগম্য)
স্টাফেন চ্যাজেলাস

@ স্টাফেনচেজেলাস যদি কোনও কারণে সিপিআইইউ সমর্থনটি আপনার কার্নেলে নির্মিত না হয় এবং আপনি এটি পুনর্নির্মাণ করতে চান না, তবে আমি মনে করি আপনি সর্বদা একটি কার্নেল মডিউল লিখতে পারেন যা কিছু ইউজারল্যান্ড ইন্টারফেস রফতানি করে যা আপনাকে struct file *পয়েন্টারগুলির সাথে তুলনা করতে দেয় ।
minmaxavg

3

আপনি যা তুলনা করতে দেখছেন সেটি struct fileহ'ল ফাইল বর্ণনাকারীরা পয়েন্টার। (কার্নেলের অভ্যন্তরে task_structপ্রতিটি থ্রেডের জন্য একটি ডেটা স্ট্রাকচার থাকে It এটি অন্য কাঠামোর একটি পয়েন্টার ধারণ করে called files_structএবং সেই কাঠামোটিতে পয়েন্টারগুলির একটি অ্যারে থাকে, প্রতিটি একে একে থাকে struct fileIt's struct fileএটি সন্ধান অফসেট, খোলা পতাকা এবং একটি ধারণ করে কয়েকটি অন্যান্য ক্ষেত্র।)

files_structকিছু অনুপ্রবেশকারী সরঞ্জাম ব্যবহার ব্যতীত অন্যটিতে পয়েন্টারগুলি দেখতে কোনও ব্যবহারকারী-দৃশ্যমান উপায় সম্পর্কে আমি জানি না । উদাহরণস্বরূপ, সিস্টেমট্যাপকে একটি পিআইডি দেওয়া যেতে পারে এবং এটি সংশ্লিষ্ট খুঁজে পেতে task_structএবং পয়েন্টারগুলি অনুসরণ করতে পারে । আপনি যদি প্যাসিভের সন্ধান করেন তবে, আমি মনে করি এটি সম্পর্কে এটি। ডেল দীর্ঘকাল আগে কেএমই (কার্নেল মেমরি সম্পাদক) নামে একটি সরঞ্জাম প্রকাশ করেছে যা কার্নেল মেমরি লাইভ করার জন্য একটি স্প্রেডশিট-জাতীয় ইন্টারফেস দিয়েছে এবং এটি আপনি যা করতে পারেন তা করতে পারে, তবে এটি কখনই 64-বিটে পোর্ট করা হয়নি। (আমি চেষ্টা করেছি এবং এটি কখনই পুরোপুরি কার্যকর হয়নি, এবং কেন তা নিশ্চিত ছিল না))

আপনি lsofসহায়ক হিসাবে সন্ধান করছেন না এমন একটি কারণ হ'ল এটি পয়েন্টারগুলি দেখতে পাচ্ছে না (তবে +fনন-লিনাক্স সিস্টেমগুলির বিকল্পটি দেখুন )। আপনি তাত্ত্বিকভাবে ক্ষেত্রের সমস্ত ক্ষেত্রের তুলনা করতে পারেন struct fileএবং ভাবেন যে দুটি কাঠামো একই, তবুও তারা পৃথক open(2)কল হতে পারে ।

কটাক্ষপাত pfiles ধারনা SystemTap স্ক্রিপ্টের। যদি আপনি এটির ঠিকানা মুদ্রণের জন্য এটি পরিবর্তন করে থাকেন তবে struct fileআপনার সমাধান হবে। আপনি ওপেন_ফাইল_বি_পিড.এসটিপি পরীক্ষা করতে পারেন যেহেতু এতে কোনও ফাংশন রয়েছে যেগুলি হাঁটাচ্ছেfiles_struct , অর্থাৎ। ফাইল বর্ণনাকারী টেবিল, struct fileঅবজেক্টের দিকে তাকিয়ে ...

আপনি কি অর্জন করতে চাইছেন আমি জিজ্ঞাসা করতে পারেন?


আমাকে স্বীকার করতে হবে যে যেখানে আমার এটির প্রয়োজন ছিল আমি খুব স্মরণ করতে পারি না। কিছু ডিবাগিং বা ফরেনসিক কাজ সন্দেহ নেই doubt
স্টাফেন চেজেলাস


আমি প্রশ্ন পোস্ট করার আগে, আমি সিস্টেমট্যাপ বা / প্রোক / কোকোরের পদ্ধতির দিকে নজর রেখেছিলাম। কঠিন অংশটি ছিল প্রতিটি কাজের প্রতিটি fd এর জন্য তথ্য পাওয়া । আমি যে সবচেয়ে প্রতিশ্রুতিবদ্ধ পন্থা পেয়েছিলাম তা হ'ল ফাংশনগুলিতে ঝাঁকুনি দেওয়া যা / প্রোক / * / টাস্ক / এফডি ডিরেক্টরিটির বিষয়বস্তু তৈরি করে, তবে উত্স ফাইলটিতে নির্দিষ্ট লাইন নম্বরগুলিতে জড়িত হওয়া কেবলমাত্র কার্যকর জিনিসই আমি আসতে পারি তাই না এক কার্নেল সংস্করণ থেকে পরের পোর্টেবল। আপনি সিস্টেমট্যাপে টাস্ক তালিকার মাধ্যমে সত্যই লুপ করতে পারবেন না। সম্ভবত / প্রোক / কোকোরের মাধ্যমে সম্ভব, তবে খুব বেশি প্রচেষ্টা এবং সম্ভবত অবিশ্বস্ত।
স্টাফেন চেজেলাস

এখন পর্যন্ত সেরা প্রতিক্রিয়া জন্য ধন্যবাদ। আমি আপনার পয়েন্টার তাকান।
স্টাফেন চেজেলাস

অবশ্যই পারবেন! একটি probe beginব্লক সেট আপ করুন for_each_processএবং এটি স্ক্রিপ্টে এম্বেড করা সি কোডের একটি ব্লকে ম্যাক্রোটি ব্যবহার করুন (সি কোড এম্বেড করার জন্য আপনাকে "গুরু" মোড সিস্টেমট্যাপ ব্যবহার করতে হবে)। আসলে, এই আকর্ষণীয় (!) করতে, আপনি সিস্টেমট্যাপের সহযোগী অ্যারেগুলির একটি ব্যবহার করতে পারেন; files_structকী হিসাবে ঠিকানা এবং মান হিসাবে পিআইডি / টিআইডিগুলির একটি তালিকা ব্যবহার করুন । আপনার কাছে এখন প্রতিটি খোলা ফাইলের একটি তালিকা রয়েছে এবং কোন কাজগুলি সেগুলি ভাগ করছে (সেগুলি পিতামাতার / সন্তানের মধ্যে ভাগ করা যায়)। আপনি যদি সিস্টেমট্যাপ নিয়ে আলোচনা করতে চান তবে আবার উত্তর দিন।
আজরেই

0

এখানে একটি লিনাক্স নির্দিষ্ট সমাধান রয়েছে: / প্রোক / স্ব / এফডি বর্তমান প্রক্রিয়াতে খোলা ফাইল হ্যান্ডলগুলির জন্য প্রতীকী লিঙ্কগুলির একটি ডিরেক্টরি। আপনি কেবল লিঙ্কের মানগুলি তুলনা করতে পারেন। একটি শিশু প্রক্রিয়া ব্যবহার করার সময় এটি আরও জটিল হয়ে ওঠে, কারণ সন্তানের আলাদা / প্রকোপ / স্ব হবে কারণ এটি একটি পিড নির্ভর নির্ভর প্রতীকী লিঙ্ক। আপনি proc কাঙ্ক্ষিত পিড যেখানে / proc / $$ / fd ব্যবহার করে এই সমস্যাটির সমাধান করতে পারেন।


ধন্যবাদ। তবে আমি যা চাইছি তা নয়। লিনাক্সে, lsof প্রকৃতপক্ষে প্রতিটি ফাইল বর্ণনাকারী এবং পতাকাগুলির জন্য / proc / pid / fdinfo এর জন্য পুনরুদ্ধার করতে / proc / pid / fd ব্যবহার করে। তবে আমি যা চাই তা হ'ল দুটি ফাইলের জন্য একই ফাইলের ক্ষেত্রে তারা একই খোলার ফাইল বর্ণনায় ইঙ্গিত করে বা যদি দুটি ফাইল বর্ণনাকারী স্বাধীনভাবে খোলা থাকে।
স্টাফেন শেজেলাস

ঠিক আছে, আপনি একই ফাইল নামের জন্য খোলার মতো ফাইল বর্ণনাকারী সংস্থাগুলি খুঁজে পাওয়ার পরে, উভয়কেই বলুন এবং ফলাফলগুলি তুলনা করুন, যদি তারা পৃথক হয় তবে। যদি তারা কোনও ফাইল বর্ণনাকারীর ক্ষেত্রে একই হয় এবং পুনরাবৃত্তি করে তবে তারা যদি এখনও মেলে তবে তারা একই।
hildred

হ্যাঁ, আমি যে প্রশ্নটিতে উল্লিখিত হিরিস্টিক পদ্ধতির এটি আরও অনুপ্রবেশকারী রূপ এবং এটি কেবল নিয়মিত ফাইলের জন্য কাজ করে (সকেট, ডিভাইসগুলি (টার্মিনালের মতো নয়), পাইপ ...)।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.