پائپ سسٹم کال سی۔

Pipe System Call C



پائپ () لینکس سسٹم کا فنکشن ہے۔ کی پائپ () سسٹم فنکشن فائل ڈسریکٹر کو کھولنے کے لیے استعمال کیا جاتا ہے ، جو لینکس کے مختلف عملوں کے درمیان بات چیت کے لیے استعمال ہوتے ہیں۔ مختصر میں ، پائپ () فنکشن لینکس میں انٹر پروسیس کمیونیکیشن کے لیے استعمال ہوتا ہے۔ اس آرٹیکل میں ، میں آپ کو دکھانے جا رہا ہوں کہ لینکس میں پائپ () سسٹم فنکشن کو کیسے استعمال کیا جائے۔ تو ، آئیے شروع کریں۔

کا نحو۔ پائپ () فنکشن ہے:







intپائپ(intپائپ ایف ڈی[])؛

یہاں ، پائپ () فنکشن انٹر پروسیس کمیونیکیشن کے لیے ایک یک طرفہ ڈیٹا چینل بناتا ہے۔ آپ ایک میں پاس int (انٹیجر) ٹائپ سرنی۔ پائپ ایف ڈی فنکشن پائپ () میں 2 سرنی عنصر پر مشتمل ہے۔ پھر پائپ () فنکشن میں دو فائل ڈسریکٹر بناتا ہے۔ پائپ ایف ڈی صف



کا پہلا عنصر۔ پائپ ایف ڈی صف ، pipefd [0] پائپ سے ڈیٹا پڑھنے کے لیے استعمال کیا جاتا ہے۔



کا دوسرا عنصر۔ پائپ ایف ڈی صف ، پائپ ایف ڈی [1] پائپ پر ڈیٹا لکھنے کے لیے استعمال کیا جاتا ہے۔





کامیابی پر ، پائپ () فنکشن 0. لوٹاتا ہے۔

پائپ () فنکشن ہیڈر میں بیان کیا گیا ہے۔ unistd.h . اپنے C پروگرام میں پائپ () فنکشن استعمال کرنے کے لیے ، آپ کو ہیڈر شامل کرنا ہوگا۔ unistd.h حسب ذیل:



#شامل کریں

پائپ () سسٹم فنکشن کے بارے میں مزید معلومات کے لیے ، پائپ () کے مین پیج کو مندرجہ ذیل کمانڈ سے چیک کریں۔

$ آدمیپائپ
پائپ کا مین پیج۔().

مثال 1:

پہلی مثال کے لیے ، ایک نئی سی سورس فائل بنائیں۔ 1_pipe.c اور کوڈ کی درج ذیل لائنیں ٹائپ کریں۔

#شامل کریں
#شامل کریں
#شامل کریں

intمرکزی(باطل) {
intپائپ ایف ڈی[]؛

اگر(پائپ(پائپ ایف ڈی) == -) {
خوف ('پائپ')؛
باہر نکلیں (EXIT_FAILURE)؛
}

پرنٹ ایف (فائل ڈسکریپٹر ویلیو پڑھیں:٪ d۔n'،پائپ ایف ڈی[])؛
پرنٹ ایف ('فائل ڈسکریپٹر ویلیو لکھیں:٪ d۔n'،پائپ ایف ڈی[])؛

واپسیEXIT_SUCCESS؛
}

یہاں ، میں نے پائپ کی ہیڈر فائل شامل کی () unistd.h پہلے درج ذیل لائن کے ساتھ۔

#شامل کریں

پھر ، میں مرکزی() فنکشن ، میں نے وضاحت کی۔ پائپ ایف ڈی مندرجہ ذیل لائن کے ساتھ دو عنصر انٹیجر سرنی۔

intپائپ ایف ڈی[]؛

پھر ، میں نے پائپ () فنکشن چلایا تاکہ فائل ڈسریکٹر کی صف کو شروع کیا جاسکے۔ پائپ ایف ڈی مندرجہ ذیل کے طور پر.

پائپ(پائپ ایف ڈی)

میں نے پائپ () فنکشن کی ریٹرن ویلیو کا استعمال کرتے ہوئے غلطیوں کی بھی جانچ کی۔ میں نے استعمال کیا باہر نکلیں() پائپ فنکشن ناکام ہونے کی صورت میں پروگرام کو ٹرمینل کرنا۔

اگر(پائپ(پائپ ایف ڈی) == -) {
خوف ('پائپ')؛
باہر نکلیں (EXIT_FAILURE)؛
}

پھر ، میں نے پڑھنے اور لکھنے والی پائپ فائل ڈسریکٹر کی قیمت پرنٹ کی۔ pipefds [0] اور پائپ ایف ڈی ایس [1] بالترتیب

پرنٹ ایف (فائل ڈسکریپٹر ویلیو پڑھیں:٪ d۔n'،پائپ ایف ڈی[])؛
پرنٹ ایف ('فائل ڈسکریپٹر ویلیو لکھیں:٪ d۔n'،پائپ ایف ڈی[])؛

اگر آپ پروگرام چلاتے ہیں تو آپ کو مندرجہ ذیل آؤٹ پٹ دیکھنا چاہیے۔ جیسا کہ آپ دیکھ سکتے ہیں ، ریڈ پائپ فائل ڈسریکٹر کی قدر۔ pipefds [0] ہے اور پائپ فائل ڈسکریپٹر لکھیں۔ پائپ ایف ڈی ایس [1] ہے .

مثال 2:

ایک اور سی سورس فائل بنائیں۔ 2_ پائپ ڈاٹ سی۔ اور کوڈ کی درج ذیل لائنیں ٹائپ کریں۔

#شامل کریں
#شامل کریں
#شامل کریں
#شامل کریں

intمرکزی(باطل) {
intپائپ ایف ڈی[]؛
چاربفر[]؛

اگر(پائپ(پائپ ایف ڈی) == -) {
خوف ('پائپ')؛
باہر نکلیں (EXIT_FAILURE)؛
}

چار *پن= '4128۔'؛

پرنٹ ایف (پائپ پر پن لکھنا ...n')؛
لکھیں(پائپ ایف ڈی[]،پن، )؛
پرنٹ ایف ('ہو گیا۔nn')؛

پرنٹ ایف (پائپ سے پن پڑھنا ...n')؛
پڑھیں(پائپ ایف ڈی[]،بفر، )؛
پرنٹ ایف ('ہو گیا۔nn')؛

پرنٹ ایف ('پائپ سے پن:٪ sn'،بفر)؛

واپسیEXIT_SUCCESS؛
}

یہ پروگرام بنیادی طور پر آپ کو پائپ پر لکھنے اور پائپ سے لکھے گئے ڈیٹا کو پڑھنے کا طریقہ دکھاتا ہے۔

یہاں ، میں نے 4 حرفی پن کوڈ کو a میں محفوظ کیا۔ چار صف صف کی لمبائی 5 ہے (بشمول NULL کردار 0)۔

چار *پن= '4128۔'؛

ہر ASCII کریکٹر کا سائز 1 بائٹ ہے۔ لہذا ، پائپ کے ذریعے 4 ہندسوں کا پن بھیجنے کے لیے ، آپ کو پائپ میں ڈیٹا کے 5 بائٹس (4 + 1 NULL کریکٹر) لکھنا ہوگا۔

5 بائٹس کا ڈیٹا لکھنا ( پن ) پائپ میں ، میں نے استعمال کیا لکھیں () رائٹ پائپ فائل ڈسریکٹر کا استعمال کرتے ہوئے کام کریں۔ پائپ ایف ڈی ایس [1] مندرجہ ذیل کے طور پر.

لکھیں(پائپ ایف ڈی[]،پن، )؛

اب جب کہ میرے پاس پائپ میں کچھ ڈیٹا ہے ، میں اسے پائپ سے استعمال کر کے پڑھ سکتا ہوں۔ پڑھیں () ریڈ پائپ فائل ڈسریکٹر پر فنکشن۔ pipefds [0] . جیسا کہ میں نے 5 بائٹس کا ڈیٹا لکھا ہے ( پن ) پائپ میں ، میں پائپ سے ڈیٹا کے 5 بائٹس بھی پڑھوں گا۔ پڑھا گیا ڈیٹا ذخیرہ کیا جائے گا بفر کردار کی صف جیسا کہ میں پائپ سے ڈیٹا کے 5 بائٹس پڑھوں گا ، بفر کردار کی صف کم از کم 5 بائٹس لمبی ہونی چاہیے۔

میں نے تعریف کی ہے بفر کے آغاز میں کریکٹر صف۔ مرکزی() فنکشن

چاربفر[]؛

اب ، میں پائپ سے پن پڑھ سکتا ہوں اور اسے اسٹور میں رکھ سکتا ہوں۔ بفر مندرجہ ذیل لائن کے ساتھ صف.

پڑھیں(پائپ ایف ڈی[]،بفر، )؛

اب جب میں نے پائپ سے پن پڑھا ہے ، میں اسے استعمال کرکے پرنٹ کرسکتا ہوں۔ پرنٹ ایف () معمول کے مطابق کام کریں

پرنٹ ایف ('پائپ سے پن:٪ sn'،بفر)؛

ایک بار جب میں پروگرام چلاتا ہوں ، صحیح پیداوار ظاہر ہوتی ہے جیسا کہ آپ دیکھ سکتے ہیں۔

مثال 3:

ایک نئی سی سورس فائل بنائیں۔ 3_pipe.c کوڈ کی مندرجہ ذیل لائنوں میں ٹائپ کریں۔

#شامل کریں
#شامل کریں
#شامل کریں
#شامل کریں
#شامل کریں
intمرکزی(باطل) {
intپائپ ایف ڈی[]؛
چار *پن؛
چاربفر[]؛

اگر(پائپ(پائپ ایف ڈی) == -) {
خوف ('پائپ')؛
باہر نکلیں (EXIT_FAILURE)؛
}

pid_t pid=کانٹا()؛

اگر(پی آئی ڈی== ) { // بچے کے عمل میں۔
پن= 4821۔'؛ // پن بھیجنا ہے۔
بند کریں(پائپ ایف ڈی[])؛ // بند پڑھیں ایف ڈی
لکھیں(پائپ ایف ڈی[]،پن، )؛ // پائپ کو پائپ لکھیں۔

پرنٹ ایف (بچے میں پن پیدا کرنا اور والدین کو بھیجنا ...n')؛
نیند()؛ // جان بوجھ کر تاخیر
باہر نکلیں (EXIT_SUCCESS)؛
}

اگر(پی آئی ڈی> ) { // اہم عمل میں
انتظار کرو(خالی)؛ // بچے کا عمل ختم ہونے کا انتظار کریں۔
بند کریں(پائپ ایف ڈی[])؛ // بند fd
پڑھیں(پائپ ایف ڈی[]،بفر، )؛ // پائپ سے پن پڑھیں۔
بند کریں(پائپ ایف ڈی[])؛ // بند پڑھیں ایف ڈی

پرنٹ ایف ('والدین نے PIN'٪ s وصول کیا 'n'،بفر)؛
}

واپسیEXIT_SUCCESS؛
}

اس مثال میں ، میں نے آپ کو دکھایا کہ بین عمل کے مواصلات کے لیے پائپ کا استعمال کیسے کریں۔ میں نے بچے کے عمل سے ایک پائپ کا استعمال کرتے ہوئے والدین کے عمل کو ایک پائپ بھیجا ہے۔ پھر والدین کے عمل میں پائپ سے پن پڑھیں اور اسے والدین کے عمل سے پرنٹ کریں۔

پہلے ، میں نے فورک () فنکشن کا استعمال کرتے ہوئے چائلڈ پروسیس بنایا ہے۔

pid_t pid=کانٹا()؛

پھر ، بچے کے عمل میں ( pid == 0 ) ، میں نے پائپ کو استعمال کرتے ہوئے پن لکھا۔ لکھیں () فنکشن

لکھیں(پائپ ایف ڈی[]،پن، )؛

ایک بار جب بچے کے عمل سے پائپ پر PIN لکھا جاتا ہے ، والدین کا عمل ( pid> 0۔ ) اسے استعمال کرتے ہوئے پائپ سے پڑھیں۔ پڑھیں () فنکشن

پڑھیں(پائپ ایف ڈی[]،بفر، )؛

پھر ، والدین کے عمل نے استعمال کرتے ہوئے PIN پرنٹ کیا۔ پرنٹ ایف () معمول کے مطابق کام کریں

پرنٹ ایف ('والدین نے PIN'٪ s وصول کیا 'n'،بفر)؛

جیسا کہ آپ دیکھ سکتے ہیں ، پروگرام چلانے سے متوقع نتیجہ ملتا ہے۔

مثال 4:

ایک نئی سی سورس فائل بنائیں۔ 4_ پائپ ڈاٹ سی۔ کوڈ کی مندرجہ ذیل لائنوں میں ٹائپ کریں۔

#شامل کریں
#شامل کریں
#شامل کریں
#شامل کریں
#شامل کریں

#PIN_LENGTH 4 کی وضاحت کریں۔
#PIN_WAIT_INTERVAL 2 کی وضاحت کریں۔

باطلgetPIN(چارپن[PIN_LENGTH+ ]) {
سرانڈ (getpid() +گیٹ پیڈ())؛

پن[] = 49۔ + قطار () ٪ ؛

کے لیے(intمیں= ؛میں<PIN_LENGTH؛میں++۔) {
پن[میں] = 48۔ + قطار () ٪ ؛
}

پن[PIN_LENGTH] = ''؛
}


intمرکزی(باطل) {
جبکہ() {
intپائپ ایف ڈی[]؛
چارپن[PIN_LENGTH+ ]؛
چاربفر[PIN_LENGTH+ ]؛

پائپ(پائپ ایف ڈی)؛

pid_t pid=کانٹا()؛

اگر(پی آئی ڈی== ) {
getPIN(پن)؛ // پن پیدا کریں۔
بند کریں(پائپ ایف ڈی[])؛ // بند پڑھیں ایف ڈی
لکھیں(پائپ ایف ڈی[]،پن،PIN_LENGTH+ )؛ // پائپ کو پائپ لکھیں۔

پرنٹ ایف (بچے میں پن پیدا کرنا اور والدین کو بھیجنا ...n')؛

نیند(PIN_WAIT_INTERVAL۔)؛ // جان بوجھ کر PIN بنانے میں تاخیر۔

باہر نکلیں (EXIT_SUCCESS)؛
}

اگر(پی آئی ڈی> ) {
انتظار کرو(خالی)؛ // بچے کے ختم ہونے کا انتظار۔

بند کریں(پائپ ایف ڈی[])؛ // بند fd
پڑھیں(پائپ ایف ڈی[]،بفر،PIN_LENGTH+ )؛ // پائپ سے پن پڑھیں۔
بند کریں(پائپ ایف ڈی[])؛ // بند پڑھیں ایف ڈی
پرنٹ ایف ('والدین نے بچے سے PIN'٪ s 'وصول کیا۔nn'،بفر)؛
}
}

واپسیEXIT_SUCCESS؛
}

یہ مثال ایک جیسی ہے۔ مثال 3۔ . فرق صرف یہ ہے کہ یہ پروگرام مسلسل بچوں کا عمل بناتا ہے ، بچے کے عمل میں ایک PIN بناتا ہے اور ایک پائپ کا استعمال کرتے ہوئے PIN کو والدین کے عمل میں بھیجتا ہے۔

والدین کا عمل پھر پائپ سے پن پڑھتا ہے اور اسے پرنٹ کرتا ہے۔

یہ پروگرام ہر PIN_WAIT_INTERVAL سیکنڈ میں ایک نیا PIN_LENGTH PIN تیار کرتا ہے۔

جیسا کہ آپ دیکھ سکتے ہیں ، پروگرام توقع کے مطابق کام کرتا ہے۔

آپ صرف دبانے سے پروگرام روک سکتے ہیں۔ + ج۔ .

تو ، اس طرح آپ پائپ () سسٹم کال کو سی پروگرامنگ زبان میں استعمال کرتے ہیں۔ اس مضمون کو پڑھنے کے لیے شکریہ۔