সি -তে ফর্ক সিস্টেম কল

Fork System Call C



ফর্ক () সিস্টেম কল একটি সি প্রোগ্রামে শিশু প্রক্রিয়া তৈরি করতে ব্যবহৃত হয়। কাঁটা () ব্যবহার করা হয় যেখানে আপনার আবেদনে সমান্তরাল প্রক্রিয়াকরণের প্রয়োজন হয়। ফর্ক () সিস্টেম ফাংশন হেডারে সংজ্ঞায়িত করা হয়েছে sys/types.h এবং unistd.h । একটি প্রোগ্রামে যেখানে আপনি কাঁটাচামচ ব্যবহার করেন, আপনাকেও অপেক্ষা () সিস্টেম কল ব্যবহার করতে হবে। অপেক্ষা () সিস্টেম কলটি সন্তানের প্রক্রিয়া শেষ হওয়ার জন্য পিতামাতার প্রক্রিয়ায় অপেক্ষা করতে ব্যবহৃত হয়। একটি শিশু প্রক্রিয়া শেষ করার জন্য, শিশু প্রক্রিয়ায় এক্সিট () সিস্টেম কল ব্যবহার করা হয়। Wait () ফাংশন হেডারে সংজ্ঞায়িত করা হয়েছে sys/wait.h এবং exit () ফাংশন হেডারে সংজ্ঞায়িত করা হয়েছে stdlib.h

চিত্র 1: বেসিক ফর্ক () ওয়ার্কফ্লো

চিত্র 1: বেসিক ফর্ক () ওয়ার্কফ্লো







এই প্রবন্ধে, আমি আপনাকে দেখাতে যাচ্ছি কিভাবে সি -তে শিশু প্রক্রিয়া তৈরির জন্য ফর্ক () সিস্টেম কল ব্যবহার করতে হয়, তাহলে চলুন শুরু করা যাক।



fork () সিনট্যাক্স এবং রিটার্ন ভ্যালু:

ফর্ক () সিস্টেম ফাংশনের সিনট্যাক্স নিম্নরূপ:



pid_t কাঁটা(শূন্য);

ফর্ক () সিস্টেম ফাংশন কোন যুক্তি গ্রহণ করে না। এটি টাইপের একটি পূর্ণসংখ্যা প্রদান করে pid_t





সাফল্যে, কাঁটা () শিশু প্রক্রিয়ার পিআইডি প্রদান করে যা 0. এর চেয়ে বড়। শিশু প্রক্রিয়ার ভিতরে, রিটার্নের মান 0. যদি কাঁটা () ব্যর্থ হয়, তাহলে এটি -1 ফেরত দেয়।

সহজ কাঁটা () উদাহরণ:

একটি সহজ কাঁটা () উদাহরণ নিচে দেওয়া হল:



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

intপ্রধান(শূন্য) {
pid_t pid=কাঁটা();

যদি(পিড== 0) {
printf ('শিশু => PPID: %d PID: %dn',গেটপিড(),getpid());
প্রস্থান (EXIT_SUCCESS);
}
অন্য যদি(পিড> 0) {
printf ('পিতামাতা => পিআইডি: %dn',getpid());
printf ('সন্তানের প্রক্রিয়া শেষ হওয়ার অপেক্ষা।n');
অপেক্ষা করুন(খালি);
printf ('শিশু প্রক্রিয়া শেষ।n');
}
অন্য {
printf ('শিশু প্রক্রিয়া তৈরি করতে অক্ষম।n');
}

প্রত্যাবর্তনEXIT_SUCCESS;
}

এখানে, আমি প্রধান/অভিভাবক প্রক্রিয়া থেকে একটি শিশু প্রক্রিয়া তৈরি করতে কাঁটা () ব্যবহার করেছি। তারপরে, আমি শিশু এবং পিতামাতার প্রক্রিয়া থেকে পিআইডি (প্রসেস আইডি) এবং পিপিআইডি (প্যারেন্ট প্রসেস আইডি) মুদ্রণ করেছি। পিতামাতার প্রক্রিয়ায় অপেক্ষা (NULL) শিশু প্রক্রিয়া শেষ হওয়ার জন্য অপেক্ষা করতে ব্যবহৃত হয়। শিশু প্রক্রিয়ায়, শিশু প্রক্রিয়াটি শেষ করতে এক্সিট () ব্যবহার করা হয়। আপনি দেখতে পাচ্ছেন, পিতামাতার প্রক্রিয়ার PID হল শিশু প্রক্রিয়ার PPID। সুতরাং, শিশু প্রক্রিয়া 24738 মূল প্রক্রিয়ার অন্তর্গত 24731

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

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

শূন্যশিশু কাজ() {
printf ('ওহে বিশ্বn');
}

শূন্যঅভিভাবক কাজ() {
printf ('মূল কাজ.n');
}

intপ্রধান(শূন্য) {
pid_t pid=কাঁটা();

যদি(পিড== 0) {
শিশু কাজ();
প্রস্থান (EXIT_SUCCESS);
}
অন্য যদি(পিড> 0) {
অপেক্ষা করুন(খালি);
অভিভাবক কাজ();
}
অন্য {
printf ('শিশু প্রক্রিয়া তৈরি করতে অক্ষম।');
}

প্রত্যাবর্তনEXIT_SUCCESS;
}

উপরের প্রোগ্রামের আউটপুট:

কাঁটা () এবং লুপ ব্যবহার করে একাধিক শিশু প্রক্রিয়া চালানো:

আপনার প্রয়োজন মতো অনেক শিশু প্রক্রিয়া তৈরি করতে আপনি লুপ ব্যবহার করতে পারেন। নীচের উদাহরণে, আমি লুপ ব্যবহার করে 5 টি শিশু প্রক্রিয়া তৈরি করেছি। আমি শিশু প্রক্রিয়া থেকে PID এবং PPID প্রিন্ট করেছি।

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

intপ্রধান(শূন্য) {
জন্য(intআমি= ;আমি<= 5;আমি++) {
pid_t pid=কাঁটা();

যদি(পিড== 0) {
printf ('শিশু প্রক্রিয়া => PPID =%d, PID =%dn',গেটপিড(),getpid());
প্রস্থান (0);
}
অন্য {
printf ('প্যারেন্ট প্রসেস => পিআইডি =%ডিn',getpid());
printf ('শিশু প্রক্রিয়া শেষ হওয়ার জন্য অপেক্ষা করা হচ্ছে ...n');
অপেক্ষা করুন(খালি);
printf ('শিশু প্রক্রিয়া শেষ।n');
}
}

প্রত্যাবর্তনEXIT_SUCCESS;
}

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

বাস্তব জীবনের উদাহরণ:

বিভিন্ন জটিল গাণিতিক গণনা যেমন md5, sha256 ইত্যাদি হ্যাশ প্রজন্মের জন্য প্রচুর প্রক্রিয়াকরণ শক্তি প্রয়োজন। মূল প্রোগ্রামের মতো একই প্রক্রিয়ায় এমন জিনিসগুলি গণনা করার পরিবর্তে, আপনি কেবল একটি শিশু প্রক্রিয়াতে হ্যাশ গণনা করতে পারেন এবং প্রধান প্রক্রিয়াটিতে হ্যাশটি ফিরিয়ে দিতে পারেন।

নিচের উদাহরণে, আমি একটি শিশু প্রক্রিয়ায় একটি 4-সংখ্যার পিন কোড তৈরি করেছি এবং এটি মূল প্রোগ্রাম, মূল প্রক্রিয়াতে পাঠিয়েছি। তারপর, আমি সেখান থেকে পিন কোড প্রিন্ট করলাম।

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

intgetPIN() {
// বীজ হিসাবে PPID এবং PID ব্যবহার করুন
srand (getpid() +গেটপিড());
intগোপন= 1000 + সারি () % 9000;
প্রত্যাবর্তনগোপন;
}

intপ্রধান(শূন্য) {
intfd[2];
পাইপ(fd);
pid_t pid=কাঁটা();

যদি(পিড> 0) {
বন্ধ(0);
বন্ধ(fd[]);
পরে(fd[0]);

intগোপন নাম্বার;
size_tReadBytes=পড়ুন(fd[0], &গোপন নাম্বার, আকার(গোপন নাম্বার));

printf ('পিনের জন্য অপেক্ষা করা হচ্ছে ...n');
অপেক্ষা করুন(খালি);
printf ('বাইট পড়ে: %ldn',ReadBytes);
printf (পিন: %dn',গোপন নাম্বার);
}
অন্য যদি(পিড== 0) {
বন্ধ();
বন্ধ(fd[0]);
পরে(fd[]);

intগোপন=getPIN();
লিখুন(fd[], &গোপন, আকার(গোপন));
প্রস্থান (EXIT_SUCCESS);
}

প্রত্যাবর্তনEXIT_SUCCESS;
}

আপনি দেখতে পাচ্ছেন, প্রতিবার যখন আমি প্রোগ্রামটি চালাই, তখন আমি একটি ভিন্ন 4-সংখ্যার পিন কোড পাই।

সুতরাং, মূলত এভাবেই আপনি লিনাক্সে ফর্ক () সিস্টেম কল ব্যবহার করেন। এই নিবন্ধটি পড়ার জন্য ধন্যবাদ।