একটি পাইপ প্রক্রিয়াগুলির মধ্যে যোগাযোগের একটি মাধ্যম। একটি প্রক্রিয়া পাইপে ডেটা রচনা করে, এবং অন্য প্রক্রিয়া পাইপ থেকে ডেটা পড়ে। এই নিবন্ধে, আমরা দেখব কিভাবে পাইপ () ফাংশনটি সি ভাষা ব্যবহার করে ধারণা বাস্তবায়নের জন্য ব্যবহার করা হয়।
পাইপ সম্পর্কে
পাইপে, ডেটা একটি FIFO ক্রমে রক্ষণাবেক্ষণ করা হয়, যার অর্থ পাইপের এক প্রান্তে ক্রমানুসারে তথ্য লেখা এবং একই অনুক্রমিক ক্রমে পাইপের অন্য প্রান্ত থেকে ডেটা পড়া।
যদি কোনো প্রক্রিয়া পাইপ থেকে পড়ে, কিন্তু অন্য কোনো প্রক্রিয়া পাইপে এখনও লেখা হয়নি, তাহলে রিটার্নের শেষ-ফাইলে পড়ুন। যদি একটি প্রক্রিয়া একটি পাইপে লিখতে চায়, কিন্তু পড়ার জন্য পাইপের সাথে অন্য কোন প্রক্রিয়া সংযুক্ত নেই, তাহলে এটি একটি ত্রুটির অবস্থা, এবং পাইপটি একটি SIGPIPE সংকেত তৈরি করে।
হেডার ফাইল
#অন্তর্ভুক্তবাক্য গঠন
intপাইপ(intদাখিল[2])
যুক্তি
এই ফাংশনটি একটি একক যুক্তি নেয়, দুটি পূর্ণসংখ্যার একটি অ্যারে ( দাখিল )। দাখিল [0] পাইপ থেকে পড়ার জন্য ব্যবহার করা হয়, এবং দাখিল [1] পাইপে লেখার জন্য ব্যবহৃত হয়। যে প্রক্রিয়াটি পাইপ থেকে পড়তে চায় তা বন্ধ হওয়া উচিত দাখিল [1], এবং যে প্রক্রিয়াটি পাইপে লিখতে চায় তা বন্ধ হওয়া উচিত দাখিল [0] । যদি পাইপের অপ্রয়োজনীয় প্রান্তগুলি স্পষ্টভাবে বন্ধ না করা হয়, তবে এন্ড-অফ-ফাইল (EOF) কখনই ফেরত দেওয়া হবে না।
মূল্য ফেরত
সাফল্যের উপর, পাইপ () 0 রিটার্ন করে, ব্যর্থতার জন্য ফাংশন রিটার্ন -1।
চিত্রগতভাবে, আমরা প্রতিনিধিত্ব করতে পারি পাইপ () নিম্নরূপ ফাংশন:
সি ভাষায় কিভাবে পাইপ ফাংশন ব্যবহার করতে হয় তা তুলে ধরার কয়েকটি উদাহরণ নিচে দেওয়া হল।
উদাহরণ 1
এই উদাহরণে, আমরা দেখতে পাই কিভাবে পাইপ ফাংশন কাজ করে। যদিও একক প্রক্রিয়ায় পাইপ ব্যবহার করা খুব একটা উপকারী নয়, কিন্তু আমরা একটি ধারণা পাব।
// উদাহরণ 1. সি#অন্তর্ভুক্ত
#অন্তর্ভুক্ত
#অন্তর্ভুক্ত
#অন্তর্ভুক্ত
intপ্রধান()
{
intn;
intদাখিল[2];
গৃহস্থালিবাফার[1025];
গৃহস্থালি *বার্তা= 'ওহে বিশ্ব!';
পাইপ(দাখিল);
লিখুন(দাখিল[ঘ],বার্তা, strlen (বার্তা));
যদি ((n=পড়ুন(দাখিল[0],বাফার, 1024 ) ) > = 0) {
বাফার[n] = 0; // স্ট্রিং বন্ধ করুন
printf ('পাইপ থেকে %d বাইট পড়ুন:'%গুলি'n',n,বাফার);
}
অন্য
ভয় ('পড়ুন');
প্রস্থান (0);
}
এখানে আমরা প্রথমে একটি পাইপ ব্যবহার করে তৈরি করেছি পাইপ () ফাংশন তারপর ব্যবহার করে পাইপে লেখা হাতির দাঁত [1] শেষ. তারপরে, পাইপের অন্য প্রান্ত ব্যবহার করে ডেটা পড়া হয়েছে, যা দাখিল [0] । ফাইল পড়ার এবং লেখার জন্য, আমরা ব্যবহার করতাম পড়ুন () এবং লিখুন () ফাংশন
উদাহরণ 2
এই উদাহরণে, আমরা দেখব কিভাবে পিতামাতা এবং শিশু প্রক্রিয়াগুলি পাইপ ব্যবহার করে যোগাযোগ করে।
// example2.c#অন্তর্ভুক্ত
#অন্তর্ভুক্ত
#অন্তর্ভুক্ত
#অন্তর্ভুক্ত
#অন্তর্ভুক্ত
intপ্রধান()
{
intদাখিল[2],nbytes;
pid_t childpid;
গৃহস্থালিস্ট্রিং[] = 'ওহে বিশ্ব!n';
গৃহস্থালিরিডবফার[80];
পাইপ(দাখিল);
যদি((শিশু=কাঁটা()) == -ঘ)
{
ভয় ('কাঁটা');
প্রস্থান (ঘ);
}
যদি(শিশু== 0)
{
বন্ধ(দাখিল[0]);// শিশু প্রক্রিয়ার পাইপের এই প্রান্তের প্রয়োজন নেই
/ * পাইপের আউটপুট পাশ দিয়ে 'স্ট্রিং' পাঠান */
লিখুন(দাখিল[ঘ],স্ট্রিং, ( strlen (স্ট্রিং)+ঘ));
প্রস্থান (0);
}
অন্য
{
/ * মূল প্রক্রিয়া পাইপের আউটপুট পাশ বন্ধ করে দেয় */
বন্ধ(দাখিল[ঘ]);// প্যারেন্ট প্রসেসের পাইপের এই প্রান্তের প্রয়োজন নেই
/ * পাইপ থেকে একটি স্ট্রিং মধ্যে পড়ুন */
nbytes=পড়ুন(দাখিল[0],রিডবফার, আকার(রিডবফার));
printf ('স্ট্রিং পড়ুন: %s',রিডবফার);
}
প্রত্যাবর্তন(0);
}
প্রথমে, পাইপ ফাংশন ব্যবহার করে একটি পাইপ তৈরি করা হয়েছে তারপর একটি শিশু প্রক্রিয়া ফর্ক করা হয়েছে। তারপরে, শিশু প্রক্রিয়াটি পড়া শেষ করে এবং পাইপে লিখে। মূল প্রক্রিয়াটি লেখার শেষটি বন্ধ করে দেয় এবং পাইপ থেকে পড়ে এবং এটি প্রদর্শন করে। এখানে ডাটা প্রবাহ হল একমাত্র উপায় যা শিশু থেকে পিতামাতার কাছে।
উপসংহার:
পাইপ () লিনাক্সে একটি শক্তিশালী সিস্টেম কল। এই প্রবন্ধে, আমরা কেবলমাত্র একমুখী ডেটা প্রবাহ দেখেছি, একটি প্রক্রিয়া লিখে, এবং অন্য প্রক্রিয়াটি পড়ে, দুটি পাইপ তৈরি করে আমরা দ্বি-নির্দেশমূলক তথ্য প্রবাহও অর্জন করতে পারি।