فورک سسٹم کال سی۔

Fork System Call C



فورک () سسٹم کال کا استعمال سی پروگرام میں بچوں کے عمل کو بنانے کے لیے کیا جاتا ہے۔ فورک () استعمال کیا جاتا ہے جہاں آپ کی درخواست میں متوازی پروسیسنگ کی ضرورت ہوتی ہے۔ فورک () سسٹم فنکشن ہیڈرز میں بیان کیا گیا ہے۔ sys/types.h اور unistd.h . ایک پروگرام میں جہاں آپ کانٹا استعمال کرتے ہیں ، آپ کو انتظار () سسٹم کال بھی استعمال کرنی پڑتی ہے۔ wait () سسٹم کال بچے کے عمل کے ختم ہونے کے لیے والدین کے عمل میں انتظار کرنے کے لیے استعمال ہوتی ہے۔ بچوں کے عمل کو ختم کرنے کے لیے ، ایگزٹ () سسٹم کال بچے کے عمل میں استعمال ہوتی ہے۔ انتظار () فنکشن ہیڈر میں بیان کیا گیا ہے۔ sys/wait.h اور ایگزٹ () فنکشن ہیڈر میں بیان کیا گیا ہے۔ stdlib.h .

تصویر 1: بنیادی فورک () ورک فلو۔

تصویر 1: بنیادی فورک () ورک فلو۔







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



فورک () نحو اور واپسی کی قیمت:

فورک () سسٹم فنکشن کا نحو اس طرح ہے:



pid_t کانٹا(باطل)؛

فورک () سسٹم فنکشن کسی دلیل کو قبول نہیں کرتا۔ یہ قسم کا ایک عدد واپس کرتا ہے۔ pid_t .





کامیابی پر ، فورک () بچے کے عمل کی پی آئی ڈی لوٹاتا ہے جو 0 سے زیادہ ہے۔ چائلڈ پروسیس کے اندر ، واپسی کی قیمت 0. ہے۔

سادہ کانٹا () مثال:

ایک سادہ کانٹا () مثال ذیل میں دی گئی ہے:



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

intمرکزی(باطل) {
pid_t pid=کانٹا()؛

اگر(پی آئی ڈی== ) {
پرنٹ ایف (بچہ => پی پی آئی ڈی:٪ ڈی پی آئی ڈی:٪ ڈی۔n'،گیٹ پیڈ()،getpid())؛
باہر نکلیں (EXIT_SUCCESS)؛
}
اور اگر(پی آئی ڈی> ) {
پرنٹ ایف ('والدین => پی آئی ڈی:٪ d۔n'،getpid())؛
پرنٹ ایف ('بچے کا عمل ختم ہونے کا انتظار۔n')؛
انتظار کرو(خالی)؛
پرنٹ ایف (بچوں کا عمل ختمn')؛
}
اور {
پرنٹ ایف ('بچے کا عمل بنانے سے قاصر۔n')؛
}

واپسیEXIT_SUCCESS؛
}

یہاں ، میں نے بنیادی/والدین کے عمل سے بچہ کا عمل بنانے کے لیے فورک () استعمال کیا۔ پھر ، میں نے بچے اور والدین کے عمل سے پی آئی ڈی (پروسیس آئی ڈی) اور پی پی آئی ڈی (پیرنٹ پروسیس آئی ڈی) پرنٹ کیا۔ والدین کے عمل پر انتظار (NULL) بچے کے عمل کے ختم ہونے کے انتظار میں استعمال ہوتا ہے۔ بچے کے عمل پر ، ایگزٹ () بچے کے عمل کو ختم کرنے کے لیے استعمال ہوتا ہے۔ جیسا کہ آپ دیکھ سکتے ہیں ، والدین کے عمل کی PID بچے کے عمل کی PPID ہے۔ تو ، بچے کا عمل۔ 24738۔ والدین کے عمل سے تعلق رکھتا ہے۔ 24731۔ .

آپ اپنے پروگرام کو مزید ماڈیولر بنانے کے لیے افعال بھی استعمال کر سکتے ہیں۔ یہاں ، میں نے استعمال کیا۔ عمل ٹاسک () اور والدین کا کام () بالترتیب بچے اور والدین کے عمل کے لیے کام کرتا ہے۔ اس طرح کانٹا () اصل میں استعمال ہوتا ہے۔

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

باطلچائلڈ ٹاسک() {
پرنٹ ایف ('ہیلو ورلڈ۔n')؛
}

باطلوالدین کا کام() {
پرنٹ ایف ('اہم کامn')؛
}

intمرکزی(باطل) {
pid_t pid=کانٹا()؛

اگر(پی آئی ڈی== ) {
چائلڈ ٹاسک()؛
باہر نکلیں (EXIT_SUCCESS)؛
}
اور اگر(پی آئی ڈی> ) {
انتظار کرو(خالی)؛
والدین کا کام()؛
}
اور {
پرنٹ ایف ('بچے کا عمل بنانے سے قاصر۔')؛
}

واپسیEXIT_SUCCESS؛
}

مندرجہ بالا پروگرام کی پیداوار:

فورک () اور لوپ کا استعمال کرتے ہوئے ایک سے زیادہ چائلڈ پروسیسز چلانا:

آپ لوپ کو زیادہ سے زیادہ چائلڈ پروسیس بنانے کے لیے بھی استعمال کر سکتے ہیں۔ نیچے دی گئی مثال میں ، میں نے لوپ کا استعمال کرتے ہوئے 5 بچوں کے عمل بنائے ہیں۔ میں نے بچوں کے عمل سے پی آئی ڈی اور پی پی آئی ڈی بھی چھاپا۔

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

intمرکزی(باطل) {
کے لیے(intمیں= ؛میں<= ؛میں++۔) {
pid_t pid=کانٹا()؛

اگر(پی آئی ڈی== ) {
پرنٹ ایف ('چائلڈ پروسیس => پی پی آئی ڈی =٪ ڈی ، پی آئی ڈی =٪ ڈی۔n'،گیٹ پیڈ()،getpid())؛
باہر نکلیں ()؛
}
اور {
پرنٹ ایف (والدین کا عمل => PID =٪ d۔n'،getpid())؛
پرنٹ ایف (بچوں کے عمل ختم ہونے کا انتظار ...n')؛
انتظار کرو(خالی)؛
پرنٹ ایف (بچے کا عمل ختمn')؛
}
}

واپسیEXIT_SUCCESS؛
}

جیسا کہ آپ دیکھ سکتے ہیں ، والدین کے عمل کی شناخت بچوں کے تمام عملوں میں ایک جیسی ہے۔ لہذا ، ان سب کا تعلق ایک ہی والدین سے ہے۔ وہ لکیری انداز میں بھی انجام دیتے ہیں۔ یکے بعد دیگرے. بچوں کے عمل کو کنٹرول کرنا ایک نفیس کام ہے۔ اگر آپ لینکس سسٹم پروگرامنگ اور یہ کیسے کام کرتا ہے کے بارے میں مزید جانیں گے ، تو آپ ان عملوں کے بہاؤ کو اپنی پسند کے مطابق کنٹرول کر سکیں گے۔

حقیقی زندگی کی مثال:

مختلف پیچیدہ ریاضیاتی حسابات جیسے md5 ، sha256 وغیرہ ہیش جنریشن کو بہت زیادہ پروسیسنگ پاور درکار ہوتی ہے۔ اس طرح کی چیزوں کو اسی پروگرام میں مرکزی پروگرام کے طور پر شمار کرنے کے بجائے ، آپ صرف بچے کے عمل پر ہیش کا حساب لگا سکتے ہیں اور ہیش کو مرکزی عمل میں واپس کر سکتے ہیں۔

مندرجہ ذیل مثال میں ، میں نے بچے کے عمل میں 4 ہندسوں کا پن کوڈ تیار کیا ہے اور اسے بنیادی پروگرام ، بنیادی پروگرام میں بھیج دیا ہے۔ پھر ، میں نے وہاں سے پن کوڈ پرنٹ کیا۔

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

intgetPIN() {
// پی پی آئی ڈی اور پی آئی ڈی کو بطور بیج استعمال کریں۔
سرانڈ (getpid() +گیٹ پیڈ())؛
intخفیہ= 1000۔ + قطار () ٪ 9000۔؛
واپسیخفیہ؛
}

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

اگر(پی آئی ڈی> ) {
بند کریں()؛
بند کریں(ایف ڈی[])؛
کے بعد(ایف ڈی[])؛

intخفیہ نمبر؛
size_tپڑھیں بائٹس=پڑھیں(ایف ڈی[]، &خفیہ نمبر، کا سائز(خفیہ نمبر))؛

پرنٹ ایف ('پن کا انتظار ہے ...n')؛
انتظار کرو(خالی)؛
پرنٹ ایف (بائٹس پڑھیں:٪ ldn'،پڑھیں بائٹس)؛
پرنٹ ایف ('PIN:٪ dn'،خفیہ نمبر)؛
}
اور اگر(پی آئی ڈی== ) {
بند کریں()؛
بند کریں(ایف ڈی[])؛
کے بعد(ایف ڈی[])؛

intخفیہ=getPIN()؛
لکھیں(ایف ڈی[]، &خفیہ، کا سائز(خفیہ))؛
باہر نکلیں (EXIT_SUCCESS)؛
}

واپسیEXIT_SUCCESS؛
}

جیسا کہ آپ دیکھ سکتے ہیں ، جب بھی میں پروگرام چلاتا ہوں ، مجھے ایک مختلف 4 ہندسوں کا پن کوڈ ملتا ہے۔

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