ফর্ক সিস্টেম কল লিনাক্স

Fork System Call Linux



ফর্ক সিস্টেম কল একটি নতুন প্রক্রিয়া তৈরি করতে ব্যবহৃত হয়। নতুন তৈরি প্রক্রিয়া হচ্ছে শিশু প্রক্রিয়া। যে প্রক্রিয়াটি কাঁটাচামচকে কল করে এবং একটি নতুন প্রক্রিয়া তৈরি করে তা হল মূল প্রক্রিয়া। শিশু এবং পিতামাতার প্রক্রিয়াগুলি একই সাথে সম্পাদিত হয়।

কিন্তু শিশু এবং পিতামাতার প্রক্রিয়াগুলি বিভিন্ন মেমরি স্পেসে থাকে। এই মেমরি স্পেসগুলির একই বিষয়বস্তু রয়েছে এবং একটি প্রক্রিয়া দ্বারা যা কিছু অপারেশন করা হয় তা অন্য প্রক্রিয়াটিকে প্রভাবিত করবে না।







যখন শিশু প্রক্রিয়া তৈরি হয়; এখন উভয় প্রক্রিয়া একই প্রোগ্রাম কাউন্টার (পিসি) থাকবে, তাই এই দুটি প্রক্রিয়া একই পরবর্তী নির্দেশনা নির্দেশ করবে। মূল প্রক্রিয়া দ্বারা খোলা ফাইলগুলি শিশু প্রক্রিয়ার জন্য একই হবে।



শিশু প্রক্রিয়াটি ঠিক তার পিতামাতার মতো কিন্তু প্রক্রিয়া আইডির মধ্যে পার্থক্য রয়েছে:



  1. চাইল্ড প্রসেসের প্রসেস আইডি হচ্ছে একটি অনন্য প্রসেস আইডি যা অন্য সকল বিদ্যমান প্রক্রিয়ার আইডি থেকে আলাদা।
  2. প্যারেন্ট প্রসেস আইডি শিশুর পিতামাতার প্রসেস আইডির মতই হবে।

শিশু প্রক্রিয়ার বৈশিষ্ট্য

একটি শিশু প্রক্রিয়া ধারণ করে এমন কিছু বৈশিষ্ট্য নিম্নরূপ:





  1. সিপিইউ কাউন্টার এবং সম্পদ ব্যবহার শূন্য রিসেট করতে আরম্ভ করা হয়।
  2. যখন মূল প্রক্রিয়াটি বন্ধ করা হয়, তখন শিশু প্রক্রিয়াগুলি কোন সংকেত পায় না কারণ prctl () এ PR_SET_PDEATHSIG অ্যাট্রিবিউট রিসেট হয়।
  3. ফর্ক () কল করতে ব্যবহৃত থ্রেড শিশু প্রক্রিয়া তৈরি করে। সুতরাং শিশু প্রক্রিয়ার ঠিকানা পিতামাতার ঠিক একই হবে।
  4. পিতামাতার প্রক্রিয়ার ফাইল বর্ণনাকারী শিশু প্রক্রিয়া দ্বারা উত্তরাধিকারসূত্রে প্রাপ্ত। উদাহরণস্বরূপ ফাইলের অফসেট বা পতাকার স্থিতি এবং I/O বৈশিষ্ট্যগুলি শিশু এবং পিতামাতার প্রক্রিয়াগুলির ফাইল বর্ণনাকারীদের মধ্যে ভাগ করা হবে। তাই অভিভাবক শ্রেণীর ফাইল বর্ণনাকারী শিশু শ্রেণীর একই ফাইল বর্ণনাকারীকে উল্লেখ করবে।
  5. অভিভাবক প্রক্রিয়ার উন্মুক্ত বার্তা সারির বর্ণনাকারী শিশু প্রক্রিয়া দ্বারা উত্তরাধিকারসূত্রে প্রাপ্ত। উদাহরণস্বরূপ যদি কোন ফাইল বর্ণনাকারীর পিতামাতার প্রক্রিয়ায় একটি বার্তা থাকে তবে একই প্রক্রিয়া শিশু প্রক্রিয়ার সংশ্লিষ্ট ফাইল বর্ণনাকারীতে উপস্থিত থাকবে। সুতরাং আমরা বলতে পারি যে এই ফাইল বর্ণনাকারীদের পতাকার মান একই।
  6. একইভাবে খোলা ডিরেক্টরি স্ট্রিমগুলি শিশু প্রক্রিয়া দ্বারা উত্তরাধিকারসূত্রে প্রাপ্ত হবে।
  7. শিশু শ্রেণীর ডিফল্ট টাইমার স্ল্যাক মান অভিভাবক শ্রেণীর বর্তমান টাইমার স্ল্যাক মানের সমান।

যেসব বৈশিষ্ট্য শিশু প্রক্রিয়ায় উত্তরাধিকার সূত্রে পাওয়া যায় না

নিম্নলিখিত কিছু বৈশিষ্ট্য যা একটি শিশু প্রক্রিয়া দ্বারা উত্তরাধিকারসূত্রে পাওয়া যায় না:

  1. স্মৃতি লক
  2. একটি শিশু শ্রেণীর মুলতুবি সংকেত খালি।
  3. প্রক্রিয়া সম্পর্কিত রেকর্ড লক (fcntl ())
  4. অসিঙ্ক্রোনাস I/O অপারেশন এবং I/O বিষয়বস্তু।
  5. ডিরেক্টরি পরিবর্তনের বিজ্ঞপ্তি।
  6. টাইমার যেমন এলার্ম (), সেটিটিমার () শিশু শ্রেণীর দ্বারা উত্তরাধিকারসূত্রে প্রাপ্ত নয়।

ফর্ক () সি

ফর্ক () এ কোন আর্গুমেন্ট নেই এবং ফর্ক () এর রিটার্ন টাইপ পূর্ণসংখ্যা। ফর্ক () ব্যবহার করা হলে আপনাকে নিম্নলিখিত হেডার ফাইলগুলি অন্তর্ভুক্ত করতে হবে:



#অন্তর্ভুক্ত
#অন্তর্ভুক্ত
#অন্তর্ভুক্ত

ফর্ক () দিয়ে কাজ করার সময়, টাইপের জন্য ব্যবহার করা যেতে পারে pid_t প্রসেস আইডির জন্য pid_t হিসাবে সংজ্ঞায়িত করা হয়েছে।

হেডার ফাইলটি যেখানে ফর্ক () সংজ্ঞায়িত করা হয়েছে তাই ফর্ক () ব্যবহার করার জন্য আপনাকে এটি আপনার প্রোগ্রামে অন্তর্ভুক্ত করতে হবে।

রিটার্ন টাইপ সংজ্ঞায়িত করা হয়েছে এবং ফর্ক () কলটি সংজ্ঞায়িত করা হয়েছে। অতএব, ফর্ক () সিস্টেম কল ব্যবহার করার জন্য আপনাকে আপনার প্রোগ্রামে উভয়ই অন্তর্ভুক্ত করতে হবে।

কাঁটাচামচ সিনট্যাক্স ()

লিনাক্স, উবুন্টুতে ফর্ক () সিস্টেম কলের সিনট্যাক্স নিম্নরূপ:

pid_t কাঁটা (অকার্যকর);

সিনট্যাক্সে রিটার্ন টাইপ হল pid_t । যখন শিশু প্রক্রিয়া সফলভাবে তৈরি হয়, তখন শিশু প্রক্রিয়ার পিআইডি পিতামাতার প্রক্রিয়ায় ফেরত দেওয়া হয় এবং 0 শিশু প্রক্রিয়ায় ফেরত দেওয়া হবে।

যদি কোন ত্রুটি থাকে তবে -1 মূল প্রক্রিয়াতে ফেরত দেওয়া হয় এবং শিশু প্রক্রিয়াটি তৈরি করা হয় না।

No arguments are passed to fork(). 

উদাহরণ 1: কলিং ফর্ক ()

নিম্নলিখিত উদাহরণটি বিবেচনা করুন যেখানে আমরা একটি নতুন শিশু প্রক্রিয়া তৈরি করতে ফর্ক () সিস্টেম কল ব্যবহার করেছি:

কোড:

#অন্তর্ভুক্ত
#অন্তর্ভুক্ত
#অন্তর্ভুক্ত

intপ্রধান()
{
কাঁটা();
printf ('ফর্ক () সিস্টেম কল ব্যবহার করেn');
প্রত্যাবর্তন 0;
}

আউটপুট:

ফর্ক () সিস্টেম কল ব্যবহার করে
ফর্ক () সিস্টেম কল ব্যবহার করে

এই প্রোগ্রামে, আমরা কাঁটা () ব্যবহার করেছি, এটি একটি নতুন শিশু প্রক্রিয়া তৈরি করবে। যখন শিশু প্রক্রিয়া তৈরি করা হয়, তখন পিতামাতা প্রক্রিয়া এবং শিশু প্রক্রিয়া উভয়ই পরবর্তী নির্দেশের দিকে নির্দেশ করবে (একই প্রোগ্রাম কাউন্টার)। এইভাবে অবশিষ্ট নির্দেশাবলী বা সি বিবৃতিগুলি প্রক্রিয়া প্রক্রিয়ার মোট সংখ্যা, অর্থাৎ 2 সম্পাদিত হবেnবার, যেখানে n হল ফর্ক () সিস্টেম কলের সংখ্যা।

সুতরাং যখন ফর্ক () কলটি একবার (2) হিসাবে ব্যবহার করা হয়= 2) আমাদের আউটপুট 2 বার হবে।

এখানে যখন ফর্ক () সিস্টেম কল ব্যবহার করা হবে, অভ্যন্তরীণ কাঠামোটি দেখতে হবে:

নিম্নলিখিত ক্ষেত্রে বিবেচনা করুন যেখানে কাঁটা () 4 বার ব্যবহার করা হয়েছে:

কোড:

#অন্তর্ভুক্ত
#অন্তর্ভুক্ত
#অন্তর্ভুক্ত

intপ্রধান()
{
কাঁটা();
কাঁটা();
কাঁটা();
কাঁটা();
printf ('ফর্ক () সিস্টেম কল ব্যবহার করে');
প্রত্যাবর্তন 0;
}

আউটপুট:

Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call Using fork() system call 

এখন তৈরি প্রক্রিয়ার মোট সংখ্যা 24= 16 এবং আমাদের প্রিন্ট স্টেটমেন্ট 16 বার কার্যকর হয়েছে।

উদাহরণ 2: ফর্ক () সফল হলে পরীক্ষা করা

নিম্নলিখিত উদাহরণে আমরা ফর্ক () দ্বারা ফেরত মান (int) পরীক্ষা করার জন্য সিদ্ধান্ত গ্রহণ নির্মাণ ব্যবহার করেছি। এবং সংশ্লিষ্ট বার্তাগুলি প্রদর্শিত হয়:

কোড:

#অন্তর্ভুক্ত
#অন্তর্ভুক্ত
#অন্তর্ভুক্ত

intপ্রধান()
{
pid_t p;
পৃ=কাঁটা();
যদি(পৃ== -)
{
printf ('ফর্ক () কল করার সময় একটি ত্রুটি আছে');
}
যদি(পৃ==0)
{
printf ('আমরা শিশু প্রক্রিয়ায় আছি');
}
অন্য
{
printf ('আমরা মূল প্রক্রিয়াতে আছি');
}
প্রত্যাবর্তন 0;
}

আউটপুট:

আমরা অভিভাবক প্রক্রিয়ায় আছি
আমরা শিশু প্রক্রিয়ায় আছি

উপরের উদাহরণে আমরা pid_t টাইপ ব্যবহার করেছি যা ফর্ক () এর রিটার্ন মান সংরক্ষণ করবে। ফর্ক () লাইনে বলা হয়:

পৃ=কাঁটা();

সুতরাং ফর্ক () দ্বারা ফেরত পূর্ণসংখ্যা মান p তে সংরক্ষণ করা হয় এবং তারপর p কে আমাদের ফর্ক () কল সফল হয়েছে কিনা তা যাচাই করার সাথে তুলনা করা হয়।

যখন ফর্ক () কল ব্যবহার করা হয় এবং শিশু সফলভাবে তৈরি হয়, তখন শিশু প্রক্রিয়ার আইডি পিতামাতার প্রক্রিয়ায় ফিরিয়ে দেওয়া হবে এবং 0 শিশু প্রক্রিয়ায় ফেরত দেওয়া হবে। পিতামাতার প্রক্রিয়ায় শিশু প্রক্রিয়ার আইডি একই হবে না শিশু প্রক্রিয়ায় শিশু প্রক্রিয়ার আইডি। শিশু প্রক্রিয়ায় শিশু প্রক্রিয়ার আইডি হবে 0।

এই টিউটোরিয়ালের মাধ্যমে আপনি লিনাক্সে ফর্ক সিস্টেম কল দিয়ে কিভাবে শুরু করবেন তা দেখতে পারেন।