কেন কোনও ভিফোর্ক বা কাঁটাচামচের শিশুকে প্রস্থান () এর পরিবর্তে _exit () কল করা উচিত?


12

ম্যান পৃষ্ঠা থেকে vfork():

vfork () কাঁটাচামচ () থেকে পৃথক যে পিতা-মাতার স্থগিত করা না হওয়া অবধি অবধি বাচ্চা (2) বা _exit (2) চালানোর জন্য কল না করে। বাচ্চা তার পিতামাতার সাথে স্ট্যাক সহ সমস্ত স্মৃতি ভাগ করে দেয় যতক্ষণ না শিশু দ্বারা নির্বাহ () জারি করা হয়। সন্তানের অবশ্যই বর্তমান ফাংশন বা কল প্রস্থান () থেকে ফিরে আসতে হবে না, তবে _exit () কল করতে পারে।

শিশুকে _exit()কেবল কল করার পরিবর্তে কেন ব্যবহার করা উচিত exit()? আমি আশা করি এই উভয় প্রযোজ্য vfork()এবং fork()।


উত্তর:


11

যেমনটি আগে দেখা গেছে , vforkসন্তানের প্রক্রিয়াটি পিতামাতার স্মৃতিতে অ্যাক্সেসের অনুমতি দেয় না। exitএটি একটি সি লাইব্রেরি ফাংশন (যে কারণে এটি প্রায়শই লেখা হয় exit(3))। এটি বিভিন্ন পরিষ্কার-পরিচ্ছন্নতার কাজ সম্পাদন করে যেমন সি স্ট্রিমগুলি ফ্লাশিং এবং ক্লোজিং (ফাংশনগুলি ঘোষিত ফাংশনগুলির মাধ্যমে খোলা ফাইলগুলি stdio.h) এবং ব্যবহারকারী-নির্দিষ্ট ফাংশনগুলির সাথে নিবন্ধিত হয়ে সম্পাদন করে atexit। এই সমস্ত কাজগুলি প্রক্রিয়া স্মৃতিতে পড়া এবং লেখার সাথে জড়িত।

_exitপরিষ্কার ছাড়াই প্রস্থান করে। এটি সরাসরি একটি সিস্টেম কল (যার কারণে এটি লিখিত হয় _exit(2)), সাধারণত একটি প্রসেসরের রেজিস্ট্রারে সিস্টেম কল নম্বর স্থাপন করে এবং একটি নির্দিষ্ট প্রসেসরের নির্দেশ (সিস্টেম কল হ্যান্ডলারের শাখা) প্রয়োগ করে প্রয়োগ করা হয়। এই প্রক্রিয়া মেমরি অ্যাক্সেস প্রয়োজন হয় না, তাই এটি পরে নিরাপদ vfork।

এরপরে fork, এ জাতীয় কোনও বিধিনিষেধ নেই: পিতামাতার এবং সন্তানের প্রক্রিয়া এখন সম্পূর্ণ স্বায়ত্তশাসিত।


vfork সন্তানের প্রক্রিয়াটিকে পিতামাতার স্মৃতিতে অ্যাক্সেস করতে দেয় না ? তবে আমি ভেবেছিলাম তারা একই ঠিকানা স্থান ভাগ করে নেবে, তাই শিশু পিতামাতার ঠিকানার জায়গাতে অ্যাক্সেস করতে পারে। এটা বোঝা কি ভুল ছিল?
— সেন

কাঁটাচামচ পরে, এই জাতীয় কোনও নিষেধাজ্ঞা নেই: পিতামাতা এবং শিশু প্রক্রিয়া এখন সম্পূর্ণ স্বায়ত্তশাসিত। তার মানে কি আমি কাঁটাচামানের বাচ্চা থেকে একটি প্রস্থান () কল করতে পারি ?
— সেন

1
@ সেন: সন্তানের পিতামাতার স্মৃতিতে অ্যাক্সেসের অনুমতি নেই। যদি আপনি এটি চেষ্টা করেন, এটি কার্যকর হতে পারে কারণ কার্নেলটি আপনাকে রক্ষা করবে না। তবে প্রভাবটি আপনি যা চান তা নাও হতে পারে; উদাহরণস্বরূপ, যদি আপনার সংকলক কোনও রেজিস্টারে কিছু মান রেখে যাওয়ার সিদ্ধান্ত নেন তবে এটি পিতামাতার প্রক্রিয়া দ্বারা দেখা যাবে না।
— গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

@ সেন: একটি কাঁটাচামচ পরে, আপনি কল প্রস্থান বা অন্য কোনও ফাংশন করতে পারেন। প্রতিটি প্রক্রিয়া কাঁটাচামচ পরে শুরু হয় (লিনাক্সে এমনকি প্রাথমিক প্রক্রিয়াটি initকার্নেল দ্বারা কাঁটাচামচ করা হয়)।
— গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

3

exitকলিং ফাংশনগুলির মতো অতিরিক্ত ক্লিনআপ করুন atexitযার দ্বারা এটি অনুলিপি করা অংশের বাইরে ডেটা অ্যাক্সেস করে। _exitইন-কার্নেল ব্যতীত যে কোনও ক্লিনআপ সিস্কেল সরাসরি ডাব্লু / আউট করে।


... এবং এটি লক্ষ করা উচিত যে কাঁটাচামচ () সমস্ত কিছু অনুলিপি করে, তাই আপনি প্রস্থান () প্রস্থানে কল করতে সক্ষম হতে পারেন এবং আপনি অবশ্যই বর্তমান ফাংশন থেকে ফিরে আসতে পারেন।
— ডারোবার্ট

3

বাচ্চা প্রক্রিয়াটি শেষ হয়ে গেলে ফ্ল্যাশ করা স্টিডিও (বা অন্যান্য) বাফার এড়াতে আপনার কাছে চাইল্ড _ এক্সিট () করুন। যেহেতু শিশু প্রক্রিয়া পিতামাতার প্রক্রিয়ার একটি সঠিক অনুলিপি গঠন করে, এখনও শিশু প্রসেসের কাছে "stdout" বা "stderr" তে যা আছে, <stdio.h> এর বাফার রয়েছে। অভিভাবক প্রসেসের বাফারগুলি পূর্ণ হয়ে উঠলে এবং ফ্লাশ হয়ে গেলে আপনি প্রস্থান () এবং প্রেরণার মাধ্যমে ডাবল আউটপুট পেতে পারেন, শিশু প্রক্রিয়াটির অ্যাকেক্সট হ্যান্ডলারগুলির মধ্যে একটি এবং পিতামাতার কাছ থেকে।

আমি বুঝতে পারি যে উপরের উত্তরটি stdio.h নির্দিষ্টকরণগুলিতে কেন্দ্রীভূত হয়েছে, তবে এই ধারণাটি সম্ভবত অন্যান্য বাফার্ড আই / ও-তেও বহন করে, ঠিক যেমন উপরের উত্তরগুলির মধ্যে একটি ইঙ্গিত করে।


1

exit(): - আই / ও স্ট্রিম এবং অনেকগুলি বন্ধ করার মতো কিছু পরিচ্ছন্নতার কাজ সম্পাদন করে এবং তারপরে কার্নেলে ফিরে আসে। _exit(): - সরাসরি কার্নেলের কাছে আসে (কোনও ক্লিনআপ কার্য সম্পাদন করবেন না)।

fork() : পিতা বা মাতা এবং সন্তানের উভয়েরই আলাদা ফাইল টেবিল রয়েছে, তাই সন্তানের দ্বারা করা পরিবর্তনটি পিতামাতার পরিবেশগত প্যারামিটারগুলিকে প্রভাবিত করে না এবং বিপরীতে।

vfork(): পিতামাতা এবং শিশু উভয়ই একই ফাইল সারণী ব্যবহার করে, তাই সন্তানের দ্বারা করা পরিবর্তন পিতামাতার পরিবেশের পরামিতিগুলিকে প্রভাবিত করে। উদাহরণস্বরূপ কিছু পরিবর্তনশীল var=10, এখন var++শিশু দ্বারা চালিত হয় এবং তারপরে পিতামাতাকে চালিত করে, আপনি var++পিতামাতার আউটপুটটিতেও এর প্রভাব দেখতে পাবেন ।

আমি যেমন বলেছি আপনি যদি এটি ব্যবহার exit()করেন vfork()তবে সমস্ত আই / ও ইতিমধ্যে বন্ধ is সুতরাং, পিতামাতার সঠিকভাবে চালানো সত্ত্বেও, আপনি সঠিক আউটপুট পেতে পারবেন না, কারণ সমস্ত ভেরিয়েবলগুলি ফ্লাশ করা হয়েছে এবং সমস্ত স্ট্রিম বন্ধ রয়েছে।

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