কাঁটাচামচ () কেন একটি ফাইল বর্ণনাকারী ফেরত ডিজাইন করা উচিত?


16

তার উপর সম্পর্কে ওয়েবপৃষ্ঠাটি স্ব-নল কৌতুক , ড্যান বার্নস্টেন সঙ্গে একটি জাতি শর্ত ব্যাখ্যা select()এবং সংকেত, অফার একটি ওয়ার্কঅ্যারাউন্ড এবং যে উপসংহারে

অবশ্যই, রাইট থিংটি fork()কোনও ফাইল আইসক্রিপটর ফিরিয়ে আনতে হবে , কোনও প্রক্রিয়া আইডি নয়।

এর দ্বারা তিনি কী বোঝাতে চেয়েছেন - এই select()সমস্ত রাজ্যের পরিবর্তনের বিষয়ে অবহিত হওয়ার জন্য একটি সিগন্যাল হ্যান্ডলার ব্যবহার না করে বাচ্চাদের প্রক্রিয়াগুলি তাদের রাজ্য পরিবর্তনগুলি পরিচালনা করতে সক্ষম হওয়ার বিষয়ে কিছু ?


এই নিবন্ধটি কি ইনপুট এবং আউটপুট মিশ্রিত হবে, বা আমি এটি সঠিকভাবে পড়ছি না?
ctrl-alt-delor

আপনি পাইপগুলির মাধ্যমে সংকেত সরবরাহ করার জন্য বলতে পারেন। এটাই আমি করি।
ctrl-alt-delor

@ সিটিআরএল-ওএলট-ডিওর, হ্যাঁ, তিনি "পাইপ ইনপুট / আউটপুট" খানিকটা অদ্ভুতভাবে ব্যবহার করেছেন বলে মনে হয় তবে আমি মনে করি যে তিনি কোথায় লিখছেন এবং কোথায় পাইপ থেকে পড়াচ্ছেন reading এই পাঠ্যটি ২০০৩ সালের, এবং আমি নিশ্চিত নই যে signalfdএরপরে এবং এ জাতীয় কিছু তখন ছিল?
ইলক্কাছু

5
তিনি কী সম্পর্কে কথা বলছিলেন তা ড্যান জানেন, যদিও তিনি কিছুটা ইচ্ছাকৃতভাবে উস্কানিমূলক হতে পারেন। যদি আমি ইচ্ছাকৃতভাবে উস্কানিমূলক হয়ে থাকি, তবে আমি অবশ্যই এটির পক্ষে মতামত প্রকাশ করব, সাইনচএলডি থেকে মুক্তি পাওয়ার জন্য রাইট থিং হবে।
স্টিভ সামিট

1
@ মোসভি আমি সামান্য অতিরঞ্জিত করছি, তবে প্রতিটি প্রোগ্রাম এবং প্রতিটি প্রোগ্রামার আমি দেখেছি যারা সিগএইচএলডি ব্যবহারের চেষ্টা করেছে তাতে সমস্যা হয়েছে had এটি একটি দৌড়ের অবস্থা হওয়ার জন্য অপেক্ষা করছে। ফিরে আসা যখন আমাদের সমস্ত wait()কিছু অবরুদ্ধ ছিল , এমন কিছু জিনিস ছিল যা আপনি করতে পারেন না, তাই কেউ সিকচএলডি আবিষ্কার করেছিলেন তবে এটি একটি খারাপ কাজ ছিল। আমার অভিজ্ঞতা, এবং এখন তারা অস্তিত্ব, চমৎকার ছড়ানো, nonblocking wait3(), wait4()এবং / অথবা waitpid()মূল স্থানে কল (সম্ভবত আপনার প্রধান ঘটনা লুপ) একটি অতি উচ্চতর বিকল্প।
স্টিভ সামিট

উত্তর:


14

আপনার উত্সটিতে সমস্যাটি বর্ণিত হয়েছে, এর select()মতো সংকেত দিয়ে বাধা দেওয়া উচিত SIGCHLD, তবে কিছু ক্ষেত্রে এটি খুব ভালভাবে কাজ করে না। কাজটির ভিত্তিতে কোনও পাইপে সিগন্যাল রাইটিং করা উচিত যা পরে দেখা হয় select()। ফাইলের বর্ণনাকারী দেখা যা প্রয়োজন তা select()হ'ল সমস্যাটি কাজ করে।

কর্মক্ষেত্রটি সিগন্যাল ইভেন্টটিকে মূলত একটি ফাইল বর্ণনাকারী ইভেন্টে রূপান্তর করে। fork()প্রথমদিকে যদি কেবল একটি এফডি ফিরিয়ে দেওয়া হয়, তবে workaround প্রয়োজন হবে না, কারণ সম্ভবত এইফডিটি সরাসরি ব্যবহার করা যেতে পারে select()

হ্যাঁ, শেষ অনুচ্ছেদে আপনার বিবরণটি আমার কাছে সঠিক বলে মনে হচ্ছে।


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


এটি বলেছিল, আমি পিআইডি পুনরায় ব্যবহার সম্পর্কে যে সমস্যাগুলি পড়েছি তা পুনরায় ব্যবহারের সমস্যাগুলি মনে করি না, সুতরাং কেউ যদি সে সম্পর্কে বিশদ বিবরণ বা স্পষ্ট করতে বা উপরের সম্পাদনা করতে চায় তবে তা নির্দ্বিধায় অনুভব করবেন না।
ইলক্কাচু

2
যেমনটি আপনি ইতিমধ্যে বলেছিলেন, পিতামাতার নিজের চাইল্ড পিড খুঁজে পাওয়ার কোনও অজুহাত পুনরায় ব্যবহার করা হয়নি। এটি সেই পরিস্থিতিতে সম্পূর্ণ নিয়ন্ত্রণে থাকে কারণ যিনি ফোন করেন তিনিই wait()
জোশুয়া

এগুলিকে জম্বি প্রসেস বলা হয় : "একটি প্রক্রিয়া যা সম্পাদন সম্পন্ন করেছে তবে প্রক্রিয়া সারণিতে এখনও একটি প্রবেশ রয়েছে: এটি" টার্মিনেটেড স্টেট "এর একটি প্রক্রিয়া child এটি শিশু প্রক্রিয়াগুলির জন্য ঘটে, যেখানে পিতামাতাকে অনুমতি দেওয়ার জন্য এখনও প্রবেশের প্রয়োজন হয় তার সন্তানের প্রস্থান স্থিতি পড়ার প্রক্রিয়া "
ল্যাসি

6
এটা তোলে এর মূল্য উল্লেখ যে এখন লিনাক্স পারেন থেকে একটি ফাইল বর্ণনাকারী (pidfd) আসতে clone, যা প্রকৃত সিস্টেম কল লিনাক্স যে কাঁটাচামচ পূজা হয়। এটি সক্ষম করার জন্য পতাকাটি বলা হয় CLONE_PIDFD- উদাহরণস্বরূপ lwn.net/Articles/784831 দেখুন
কেজে তাসানকটিসিডিস

1
@ লিয় রায়ান, " স্থানীয় হ্যান্ডেল ধারণাগতভাবে আরও সঠিক হওয়ার চেয়ে " কাঁটাচামচ () থাকার কারণে একটি গ্লোবাল হ্যান্ডেল ফিরে আসে কারণ উইন্ডোজ প্রক্রিয়া হ্যান্ডেলগুলি ব্যবহার করে। " প্রক্রিয়াটিতে সমস্ত হ্যান্ডলগুলি বন্ধ না হওয়া অবধি পিড এবং প্রস্থান কোড স্টিক থাকে (ইউনিক্স সিস্টেমে রেস শর্তগুলি এড়িয়ে চলা পিতা-মাতার অপেক্ষা না করা)। হ্যান্ডলগুলি প্রক্রিয়াটি বাঁচিয়ে রাখলে, এগুলি বিশ্বব্যাপী না হয়ে স্থানীয় হ্যান্ডেল হওয়ার চেয়ে অনেক বেশি বোঝা যায়।
ইকগামি

9

এটি কেবল "ইউনিক্সের চেয়ে আলাদাভাবে নকশা করা থাকলে এটি দুর্দান্ত হবে" এর আদলে মজাদার।

পিআইডি-র সমস্যাগুলি হ'ল তারা এমন একটি বিশ্বব্যাপী নেমস্পেসে বাস করে যেখানে তাদের অন্য প্রক্রিয়াটির জন্য পুনরায় ব্যবহার করা যেতে পারে, এবং fork()পিতামাতাকে এমন কিছু হ্যান্ডেল ফিরিয়ে দেওয়া হয় যা সর্বদা শিশু প্রক্রিয়াটি উল্লেখ করার গ্যারান্টিযুক্ত থাকে এবং এটি ভাল হবে it উত্তরাধিকার বা ইউনিক্স সকেট / SCM_RIGHTS[1] এর মাধ্যমে অন্যান্য প্রক্রিয়াতে যেতে পারে ।

লিনাক্সে একটি পতাকা যুক্ত করা সহ এটি একটি পিআইডি-র পরিবর্তে পিড-এফডি ফিরিয়ে আনবে এমন একটি সাম্প্রতিক প্রচেষ্টার জন্য এখানে আলোচনাটি দেখুন clone()

তবে তারপরেও, এটি সেই স্ব-পাইপ হ্যাক [2] বা আরও ভাল ইন্টারফেসের প্রয়োজনীয়তা দূর করতে পারে না, যেহেতু সন্তানের অবস্থা সম্পর্কে পিতামাতার প্রক্রিয়া সম্পর্কে অবহিত করা সংকেতগুলি কেবলমাত্র প্রধান লুপটিতে আপনি পরিচালনা করতে চান না প্রোগ্রামের। দুর্ভাগ্যক্রমে, epoll(7) + signalfd(2)লিনাক্স বা kqueue(2)বিএসডি- তে জিনিসগুলি মানসম্মত নয় - একমাত্র মানক ইন্টারফেস (তবে পুরানো সিস্টেমে সমর্থিত নয়) অনেক নিম্নমানের pselect(2)

[1] waitpid()পিএসআইডি সিস্কলটি ফিরে আসার সময় এবং তার রিটার্নের মানটি ব্যবহার করার সময়টিকে পুনরায় সাইকেল চালানো থেকে বিরত রাখা সম্ভব waitid(.., WNOWAIT)পরিবর্তে ব্যবহার করে নতুন সিস্টেমে অর্জন করা যেতে পারে ।

[২] আমি ডিজে বার্নস্টেইনের দাবিতে কোনও মন্তব্য করব না যে তিনি এটি আবিষ্কার করেছিলেন (অ্যাপোফেসিসের জন্য দুঃখিত ;-))।


8

বার্নস্টেইন এই "রাইট থিং" মন্তব্যটির জন্য খুব বেশি প্রসঙ্গ দেয় না, তবে আমি একটি অনুমানের ঝুঁকি নিয়ে যাব: কাঁটা (২) পিআইডি ফিরিয়ে নেওয়া ফাইল (2) খোলা (2), ক্রিয়েট (2) ইত্যাদির সাথে ফাইলের বিবরণী ফিরিয়ে দেওয়ার সাথে অসামঞ্জস্যপূর্ণ। ইউনিক্স সিস্টেমের বাকী অংশগুলি একটি পিআইডি পরিবর্তে একটি ফাইল বর্ণনাকারী দ্বারা একটি প্রক্রিয়া প্রতিনিধিত্ব করে প্রক্রিয়া ম্যানিপুলেশন করতে পারে। একটি সিস্টেম কল সিগন্যালডিডি (2) উপস্থিত রয়েছে, যা সংকেত এবং ফাইল বর্ণনাকারীদের মধ্যে কিছুটা ভাল কথোপকথনের অনুমতি দেয় এবং দেখায় যে কোনও ফাইল-বর্ণনাকারী-কোনও প্রক্রিয়াটি কাজ করতে পারে।


সিগন্যালফডি (২) দুর্দান্ত দেখায়, এটি উল্লেখ করার জন্য ধন্যবাদ! খুব খারাপ এটি লিনাক্স-কেবল।
লাসি

1
pidfd_openলিনাক্সেও এই সম্পর্কে আলোচনা হয়েছে , উদাহরণস্বরূপ দেখুন lwn.net/Articles/789023
২১ শে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.