সি -তে পাইপ সিস্টেম কল

Pipe System Call C



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

এর সিনট্যাক্স পাইপ () ফাংশন হল:







intপাইপ(intপাইপএফডি[2]);

এখানে, পাইপ () ফাংশন আন্ত -প্রক্রিয়া যোগাযোগের জন্য একটি একমুখী ডাটা চ্যানেল তৈরি করে। আপনি একটি পাস int (পূর্ণসংখ্যা) টাইপ অ্যারে পাইপএফডি ফাংশন পাইপ () থেকে 2 টি অ্যারে উপাদান নিয়ে গঠিত। তারপর পাইপ () ফাংশন দুটি ফাইল বর্ণনাকারী তৈরি করে পাইপএফডি অ্যারে



এর প্রথম উপাদান পাইপএফডি অ্যারে, pipefd [0] পাইপ থেকে তথ্য পড়ার জন্য ব্যবহৃত হয়।



এর দ্বিতীয় উপাদান পাইপএফডি অ্যারে, পাইপএফডি [1] পাইপে ডেটা লেখার জন্য ব্যবহৃত হয়।





সাফল্যে, পাইপ () ফাংশন 0. রিটার্ন করে।

পাইপ () ফাংশন হেডারে সংজ্ঞায়িত করা হয়েছে unistd.h । আপনার সি প্রোগ্রামে পাইপ () ফাংশন ব্যবহার করার জন্য, আপনাকে অবশ্যই হেডার অন্তর্ভুক্ত করতে হবে unistd.h নিম্নরূপ:



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

পাইপ () সিস্টেম ফাংশন সম্পর্কে আরও তথ্যের জন্য, নিম্নলিখিত কমান্ড দিয়ে পাইপ () এর ম্যান পৃষ্ঠাটি পরীক্ষা করুন:

$ মানুষ2পাইপ
পাইপের ম্যান পেজ()

উদাহরণ 1:

প্রথম উদাহরণের জন্য, একটি নতুন সি সোর্স ফাইল তৈরি করুন 1_ পাইপ.সি এবং নিম্নলিখিত কোডগুলির লাইন টাইপ করুন।

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

intপ্রধান(শূন্য) {
intপাইপফডস[2];

যদি(পাইপ(পাইপফডস) == -) {
ভয় ('পাইপ');
প্রস্থান (EXIT_FAILURE);
}

printf ('ফাইলের বর্ণনাকারীর মূল্য পড়ুন: %dn',পাইপফডস[0]);
printf ('ফাইল বর্ণনাকারীর মান লিখুন: %dn',পাইপফডস[]);

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

এখানে, আমি পাইপের হেডার ফাইল অন্তর্ভুক্ত করেছি () unistd.h প্রথমে নিচের লাইন দিয়ে।

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

তারপর, মধ্যে প্রধান () ফাংশন, আমি সংজ্ঞায়িত করেছি পাইপফডস নিম্নলিখিত লাইন সহ দুটি উপাদান পূর্ণসংখ্যা অ্যারে।

intপাইপফডস[2];

তারপরে, আমি ফাইল বর্ণনাকারী অ্যারে আরম্ভ করার জন্য পাইপ () ফাংশনটি চালাই পাইপফডস নিম্নরূপ.

পাইপ(পাইপফডস)

আমি পাইপ () ফাংশনের রিটার্ন মান ব্যবহার করে ত্রুটির জন্যও পরীক্ষা করেছি। আমি ব্যবহার করেছি প্রস্থান () পাইপ ফাংশন ব্যর্থ হলে প্রোগ্রাম টার্মিনাল করতে ফাংশন।

যদি(পাইপ(পাইপফডস) == -) {
ভয় ('পাইপ');
প্রস্থান (EXIT_FAILURE);
}

তারপরে, আমি পাইপ ফাইলের বর্ণনাকারীদের পড়া এবং লেখার মান মুদ্রণ করেছি পাইপফডস [0] এবং পাইপফডস [1] যথাক্রমে

printf ('ফাইলের বর্ণনাকারীর মূল্য পড়ুন: %dn',পাইপফডস[0]);
printf ('ফাইল বর্ণনাকারীর মান লিখুন: %dn',পাইপফডস[]);

আপনি যদি প্রোগ্রামটি চালান, তাহলে আপনাকে নিম্নলিখিত আউটপুট দেখতে হবে। আপনি দেখতে পাচ্ছেন, রিড পাইপ ফাইলের বর্ণনাকারীর মান পাইপফডস [0] হয় 3 এবং পাইপ ফাইল বর্ণনাকারী লিখুন পাইপফডস [1] হয় 4

উদাহরণ 2:

আরেকটি সি সোর্স ফাইল তৈরি করুন 2_ পাইপ.সি এবং নিম্নলিখিত কোডগুলির লাইন টাইপ করুন।

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

intপ্রধান(শূন্য) {
intপাইপফডস[2];
গৃহস্থালিবাফার[5];

যদি(পাইপ(পাইপফডস) == -) {
ভয় ('পাইপ');
প্রস্থান (EXIT_FAILURE);
}

গৃহস্থালি *পিন= '4128 0';

printf ('পাইপে পিন লেখা হচ্ছে ...n');
লিখুন(পাইপফডস[],পিন, 5);
printf ('সম্পন্ন.nn');

printf ('পাইপ থেকে পিন পড়া ...n');
পড়ুন(পাইপফডস[0],বাফার, 5);
printf ('সম্পন্ন.nn');

printf ('পাইপ থেকে পিন: %sn',বাফার);

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

এই প্রোগ্রামটি মূলত আপনাকে দেখায় কিভাবে পাইপে লিখতে হয় এবং পাইপ থেকে আপনার লেখা ডেটা পড়তে হয়।

এখানে, আমি একটি 4-অক্ষরের পিন কোড সংরক্ষণ করেছি গৃহস্থালি অ্যারে অ্যারের দৈর্ঘ্য 5 (নুল অক্ষর 0 সহ)।

গৃহস্থালি *পিন= '4128 0';

প্রতিটি ASCII অক্ষর সি -তে 1 বাইট আকারের। তাই, পাইপের মাধ্যমে 4 ডিজিটের পিন পাঠাতে, আপনাকে অবশ্যই পাইপে 5 বাইট (4 + 1 নুল অক্ষর) ডেটা লিখতে হবে।

5 বাইট ডেটা লিখতে ( পিন ) পাইপের মধ্যে, আমি লিখুন () লেখার পাইপ ফাইল বর্ণনাকারী ব্যবহার করে ফাংশন পাইপফডস [1] নিম্নরূপ.

লিখুন(পাইপফডস[],পিন, 5);

এখন যেহেতু পাইপে আমার কিছু ডেটা আছে, আমি পাইপ থেকে এটি ব্যবহার করতে পারি পড়ুন () রিড পাইপ ফাইলের বর্ণনাকারীর কাজ পাইপফডস [0] । যেহেতু আমি 5 বাইট ডেটা লিখেছি ( পিন ) পাইপে, আমি পাইপ থেকে 5 বাইট ডেটা পড়ব। পড়া তথ্য সংরক্ষণ করা হবে বাফার অক্ষর অ্যারে যেহেতু আমি পাইপ থেকে 5 বাইট ডেটা পড়ব, বাফার অক্ষর অ্যারে কমপক্ষে 5 বাইট দীর্ঘ হতে হবে।

আমি সংজ্ঞায়িত করেছি বাফার এর শুরুতে অক্ষর অ্যারে প্রধান () ফাংশন

গৃহস্থালিবাফার[5];

এখন, আমি পাইপ থেকে পিন পড়তে এবং এটিতে সংরক্ষণ করতে পারি বাফার নিচের লাইন সহ অ্যারে।

পড়ুন(পাইপফডস[0],বাফার, 5);

এখন যেহেতু আমি পাইপ থেকে পিন পড়েছি, আমি এটি ব্যবহার করে মুদ্রণ করতে পারি printf () যথারীতি কাজ।

printf ('পাইপ থেকে পিন: %sn',বাফার);

একবার আমি প্রোগ্রামটি চালালে, সঠিক আউটপুট প্রদর্শিত হয় যেমন আপনি দেখতে পারেন।

উদাহরণ 3:

একটি নতুন সি সোর্স ফাইল তৈরি করুন 3_ পাইপ.সি কোডের নিম্নলিখিত লাইনগুলিতে টাইপ করুন।

#অন্তর্ভুক্ত
#অন্তর্ভুক্ত
#অন্তর্ভুক্ত
#অন্তর্ভুক্ত
#অন্তর্ভুক্ত
intপ্রধান(শূন্য) {
intপাইপফডস[2];
গৃহস্থালি *পিন;
গৃহস্থালিবাফার[5];

যদি(পাইপ(পাইপফডস) == -) {
ভয় ('পাইপ');
প্রস্থান (EXIT_FAILURE);
}

pid_t pid=কাঁটা();

যদি(পিড== 0) { // শিশু প্রক্রিয়ায়
পিন= '4821 0'; // পাঠাতে পিন
বন্ধ(পাইপফডস[0]); // বন্ধ পড়া fd
লিখুন(পাইপফডস[],পিন, 5); // পাইপে পিন লিখুন

printf (সন্তানের মধ্যে পিন তৈরি করা এবং পিতামাতার কাছে পাঠানো ...n');
ঘুম(2); // ইচ্ছাকৃত বিলম্ব
প্রস্থান (EXIT_SUCCESS);
}

যদি(পিড> 0) { // প্রধান প্রক্রিয়ায়
অপেক্ষা করুন(খালি); // শিশু প্রক্রিয়া শেষ হওয়ার জন্য অপেক্ষা করুন
বন্ধ(পাইপফডস[]); // বন্ধ লিখুন fd
পড়ুন(পাইপফডস[0],বাফার, 5); // পাইপ থেকে পিন পড়ুন
বন্ধ(পাইপফডস[0]); // বন্ধ পড়া fd

printf ('পিতামাতা পিন পেয়েছেন'%s 'n',বাফার);
}

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

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

প্রথমে, আমি ফর্ক () ফাংশন ব্যবহার করে একটি শিশু প্রক্রিয়া তৈরি করেছি।

pid_t pid=কাঁটা();

তারপর, শিশু প্রক্রিয়ায় ( pid == 0 ), আমি পাইপ ব্যবহার করে পিন লিখেছি লিখুন () ফাংশন

লিখুন(পাইপফডস[],পিন, 5);

একবার শিশু প্রক্রিয়া থেকে পাইপে পিন লেখা হয়, পিতামাতার প্রক্রিয়া ( pid> 0 ) এটি ব্যবহার করে পাইপ থেকে পড়ুন পড়ুন () ফাংশন

পড়ুন(পাইপফডস[0],বাফার, 5);

তারপর, প্যারেন্ট প্রসেস ব্যবহার করে পিন প্রিন্ট করে printf () যথারীতি কাজ।

printf ('পিতামাতা পিন পেয়েছেন'%s 'n',বাফার);

আপনি দেখতে পাচ্ছেন, প্রোগ্রামটি চালানো প্রত্যাশিত ফলাফল দেয়।

উদাহরণ 4:

একটি নতুন সি সোর্স ফাইল তৈরি করুন 4_ পাইপ.সি কোডের নিম্নলিখিত লাইনগুলিতে টাইপ করুন।

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

#PIN_LENGTH নির্ধারণ করুন 4
#PIN_WAIT_INTERVAL 2 নির্ধারণ করুন

শূন্যgetPIN(গৃহস্থালিপিন[PIN_LENGTH+ ]) {
srand (getpid() +গেটপিড());

পিন[0] = 49 + সারি () % 7;

জন্য(intআমি= ;আমি<PIN_LENGTH;আমি++) {
পিন[আমি] = 48 + সারি () % 7;
}

পিন[PIN_LENGTH] = ' 0';
}


intপ্রধান(শূন্য) {
যখন() {
intপাইপফডস[2];
গৃহস্থালিপিন[PIN_LENGTH+ ];
গৃহস্থালিবাফার[PIN_LENGTH+ ];

পাইপ(পাইপফডস);

pid_t pid=কাঁটা();

যদি(পিড== 0) {
getPIN(পিন); // পিন তৈরি করুন
বন্ধ(পাইপফডস[0]); // বন্ধ পড়া fd
লিখুন(পাইপফডস[],পিন,PIN_LENGTH+ ); // পাইপে পিন লিখুন

printf (সন্তানের মধ্যে পিন তৈরি করা এবং পিতামাতার কাছে পাঠানো ...n');

ঘুম(PIN_WAIT_INTERVAL); // ইচ্ছাকৃতভাবে পিন প্রজন্ম বিলম্বিত করা।

প্রস্থান (EXIT_SUCCESS);
}

যদি(পিড> 0) {
অপেক্ষা করুন(খালি); // সন্তানের শেষ হওয়ার অপেক্ষায়

বন্ধ(পাইপফডস[]); // বন্ধ লিখুন fd
পড়ুন(পাইপফডস[0],বাফার,PIN_LENGTH+ ); // পাইপ থেকে পিন পড়ুন
বন্ধ(পাইপফডস[0]); // বন্ধ পড়া fd
printf (পিতামাতা সন্তানের কাছ থেকে '%s' পিন পেয়েছেনnn',বাফার);
}
}

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

এই উদাহরণটি একই উদাহরণ 3 । পার্থক্য শুধু এই যে এই প্রোগ্রাম ক্রমাগত একটি শিশু প্রক্রিয়া তৈরি করে, শিশু প্রক্রিয়ায় একটি পিন তৈরি করে এবং একটি পাইপ ব্যবহার করে পিতামাতার প্রসেসে পিন পাঠায়।

মূল প্রক্রিয়াটি তখন পাইপ থেকে পিন পড়ে এবং প্রিন্ট করে।

এই প্রোগ্রামটি প্রতি PIN_WAIT_INTERVAL সেকেন্ডে একটি নতুন PIN_LENGTH PIN তৈরি করে।

আপনি দেখতে পাচ্ছেন, প্রোগ্রামটি প্রত্যাশা অনুযায়ী কাজ করে।

আপনি কেবল টিপে প্রোগ্রামটি বন্ধ করতে পারেন +

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