سی زبان میں سگنل ہینڈلرز کا استعمال کیسے کریں؟

How Use Signal Handlers C Language



اس آرٹیکل میں ہم آپ کو دکھانے جا رہے ہیں کہ لینکس میں سگنل ہینڈلرز کو C زبان کا استعمال کیسے کریں۔ لیکن پہلے ہم بحث کریں گے کہ سگنل کیا ہے ، یہ کچھ عام سگنل کیسے پیدا کرے گا جسے آپ اپنے پروگرام میں استعمال کر سکتے ہیں اور پھر ہم دیکھیں گے کہ پروگرام چلنے کے دوران مختلف سگنلز کو ایک پروگرام کیسے سنبھال سکتا ہے۔ تو ، آئیے شروع کرتے ہیں۔

سگنل۔

سگنل ایک ایسا واقعہ ہے جو کسی عمل یا دھاگے کو مطلع کرنے کے لیے پیدا ہوتا ہے کہ کچھ اہم صورت حال آچکی ہے۔ جب کسی عمل یا دھاگے کو سگنل موصول ہوتا ہے تو ، عمل یا دھاگہ اپنے کام کو روک دے گا اور کچھ کارروائی کرے گا۔ سگنل بین عمل کے مواصلات کے لیے مفید ہو سکتا ہے۔







معیاری سگنل۔

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



میکرو۔ این ایس آئی جی بیان کردہ سگنل کی کل تعداد ہے۔ کی قدر۔ این ایس آئی جی تعریف کردہ سگنل کی کل تعداد سے زیادہ ہے (تمام سگنل نمبر لگاتار مختص کیے جاتے ہیں)۔



معیاری اشارے درج ذیل ہیں۔





سگنل کا نام۔ تفصیل
SIGHUP عمل کو لٹکا دیں۔ SIGHUP سگنل صارف کے ٹرمینل کے منقطع ہونے کی اطلاع دینے کے لیے استعمال کیا جاتا ہے ، ممکنہ طور پر اس لیے کہ ریموٹ کنکشن کھو جاتا ہے یا ہینگ ہو جاتا ہے۔
SIGINT عمل میں خلل ڈالیں۔ جب صارف INTR کیریکٹر ٹائپ کرتا ہے (عام طور پر Ctrl + C) SIGINT سگنل بھیجا جاتا ہے۔
SIGQUIT عمل چھوڑ دیں۔ جب صارف QUIT کیریکٹر ٹائپ کرتا ہے (عام طور پر Ctrl + ) SIGQUIT سگنل بھیجا جاتا ہے۔
مہر غیر قانونی ہدایات۔ جب ردی کی ٹوکری یا مراعات یافتہ ہدایات پر عمل کرنے کی کوشش کی جاتی ہے تو ، سگنل سگنل پیدا ہوتا ہے۔ اس کے علاوہ ، SIGILL پیدا کیا جا سکتا ہے جب اسٹیک بھر جائے ، یا جب سسٹم کو سگنل ہینڈلر چلانے میں دشواری ہو۔
SIGTRAP ٹریس ٹریپ۔ بریک پوائنٹ انسٹرکشن اور دیگر ٹریپ انسٹرکشن SIGTRAP سگنل تیار کرے گی۔ ڈیبگر اس سگنل کو استعمال کرتا ہے۔
SIGABRT اسقاط SIGABRT سگنل پیدا ہوتا ہے جب abort () فنکشن کہا جاتا ہے۔ یہ سگنل ایک غلطی کی طرف اشارہ کرتا ہے جو خود پروگرام کے ذریعہ پتہ چلا ہے اور abort () فنکشن کال کے ذریعہ رپورٹ کیا گیا ہے۔
SIGFPE فلوٹنگ پوائنٹ رعایت جب ایک مہلک ریاضی کی غلطی واقع ہوئی SIGFPE سگنل پیدا ہوتا ہے۔
SIGUSR1 اور SIGUSR2۔ سگنل SIGUSR1 اور SIGUSR2 آپ کی مرضی کے مطابق استعمال ہو سکتے ہیں۔ اس پروگرام میں ان کے لیے سگنل ہینڈلر لکھنا مفید ہے جو سادہ بین عمل کے مواصلات کے لیے سگنل وصول کرتا ہے۔

سگنلز کی ڈیفالٹ ایکشن۔

ہر سگنل کی ڈیفالٹ ایکشن ہوتی ہے ، مندرجہ ذیل میں سے ایک:

مدت: عمل ختم ہو جائے گا۔
لازمی: یہ عمل ختم ہو جائے گا اور ایک بنیادی ڈمپ فائل تیار کرے گا۔
اگن: عمل سگنل کو نظر انداز کرے گا۔
روکیں: عمل رک جائے گا۔
کھاتہ: یہ عمل رکنے سے جاری رہے گا۔



ہینڈلر فنکشن کا استعمال کرتے ہوئے ڈیفالٹ ایکشن کو تبدیل کیا جا سکتا ہے۔ کچھ سگنل کی ڈیفالٹ ایکشن تبدیل نہیں کی جا سکتی۔ سگل اور SIGABRT سگنل کی ڈیفالٹ ایکشن کو تبدیل یا نظر انداز نہیں کیا جا سکتا۔

سگنل ہینڈلنگ۔

اگر کوئی عمل سگنل وصول کرتا ہے تو ، اس عمل میں اس قسم کے سگنل کے لیے عمل کا انتخاب ہوتا ہے۔ یہ عمل سگنل کو نظر انداز کرسکتا ہے ، ہینڈلر فنکشن کی وضاحت کرسکتا ہے ، یا اس قسم کے سگنل کے لیے ڈیفالٹ ایکشن کو قبول کرسکتا ہے۔

  • اگر سگنل کے لیے مخصوص عمل کو نظر انداز کیا جاتا ہے ، تو سگنل فورا خارج کر دیا جاتا ہے۔
  • پروگرام فنکشن کا استعمال کرتے ہوئے ہینڈلر فنکشن رجسٹر کر سکتا ہے جیسے۔ سگنل یا ہنگامہ . اسے کہتے ہیں ہینڈلر سگنل پکڑتا ہے۔
  • اگر سگنل کو نہ سنبھالا گیا ہے اور نہ ہی نظر انداز کیا گیا ہے تو ، اس کی ڈیفالٹ کارروائی ہوتی ہے۔

ہم سگنل کو استعمال کرتے ہوئے سنبھال سکتے ہیں۔ سگنل یا ہنگامہ فنکشن یہاں ہم دیکھتے ہیں کہ کس طرح آسان ہے۔ سگنل () فنکشن سگنل سنبھالنے کے لیے استعمال ہوتا ہے۔

intسگنل() (intنشان، باطل (*فنکشن)(int))

کی سگنل () کال کریں گے فنکشن اگر عمل سگنل وصول کرتا ہے تو کام کریں۔ نشان . کی سگنل () کام کرنے کے لیے ایک پوائنٹر لوٹاتا ہے۔ فنکشن اگر کامیاب ہے یا یہ غلطی کو غلطی پر واپس کرتا ہے اور -1 دوسری صورت میں۔

کی فنکشن پوائنٹر کی تین اقدار ہوسکتی ہیں:

  1. SIG_DFL : یہ سسٹم ڈیفالٹ فنکشن کی طرف اشارہ ہے۔ SIG_DFL () ، میں اعلان کیا گیا h ہیڈر فائل. یہ سگنل کی ڈیفالٹ ایکشن لینے کے لیے استعمال ہوتا ہے۔
  2. SIG_IGN : یہ نظام کو نظر انداز کرنے کا کام ہے۔ SIG_IGN () ، میں اعلان کیا گیا h ہیڈر فائل.
  3. صارف کی وضاحت کردہ ہینڈلر فنکشن پوائنٹر۔ : صارف کی وضاحت شدہ ہینڈلر فنکشن کی قسم ہے۔ باطل (*) (int) ، مطلب ہے واپسی کی قسم باطل ہے اور قسم کی ایک دلیل int۔

بنیادی سگنل ہینڈلر کی مثال

#شامل کریں
#شامل کریں
#شامل کریں
باطلsig_handler(intنشان){

// ہینڈلر فنکشن کی واپسی کی قسم باطل ہونی چاہیے۔
پرنٹ ایف ('nہینڈلر فنکشن کے اندر۔n')؛
}

intمرکزی(){
سگنل(SIGINT،sig_handler)؛ // رجسٹر سگنل ہینڈلر۔
کے لیے(intمیں=؛؛میں++۔){ // لامحدود لوپ۔
پرنٹ ایف ('٪ d: مین فنکشن کے اندر۔n'،میں)؛
نیند()؛ // 1 سیکنڈ کے لیے تاخیر۔
}
واپسی ؛
}

Example1.c کے آؤٹ پٹ کے اسکرین شاٹ میں ، ہم دیکھ سکتے ہیں کہ مین فنکشن میں لامحدود لوپ چل رہا ہے۔ جب صارف ٹائپ کرتا ہے Ctrl+C ، مین فنکشن پر عملدرآمد رک جاتا ہے اور سگنل کا ہینڈلر فنکشن طلب کیا جاتا ہے۔ ہینڈلر فنکشن کی تکمیل کے بعد ، مین فنکشن پر عملدرآمد دوبارہ شروع ہوا۔ جب صارف کی قسم ٹائپ ہوتی ہے Ctrl+ ، عمل ختم ہو جاتا ہے۔

سگنلز کی مثال کو نظر انداز کریں۔

#شامل کریں
#شامل کریں
#شامل کریں
intمرکزی(){
سگنل(SIGINT،SIG_IGN)؛ // سگنل کو نظر انداز کرنے کے لیے سگنل ہینڈلر رجسٹر کریں۔

کے لیے(intمیں=؛؛میں++۔){ // لامحدود لوپ۔
پرنٹ ایف ('٪ d: مین فنکشن کے اندر۔n'،میں)؛
نیند()؛ // 1 سیکنڈ کے لیے تاخیر۔
}
واپسی ؛
}

یہاں ہینڈلر فنکشن رجسٹر ہے۔ SIG_IGN () سگنل کی کارروائی کو نظر انداز کرنے کے لیے فنکشن لہذا ، جب صارف نے Ctrl+C ٹائپ کیا ، SIGINT سگنل پیدا ہو رہا ہے لیکن عمل نظر انداز کر دیا گیا ہے۔

دوبارہ رجسٹر سگنل ہینڈلر کی مثال۔

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

باطلsig_handler(intنشان){
پرنٹ ایف ('nہینڈلر فنکشن کے اندر۔n')؛
سگنل(SIGINT،SIG_DFL)؛ // ڈیفالٹ ایکشن کیلئے سگنل ہینڈلر کو دوبارہ رجسٹر کریں۔
}

intمرکزی(){
سگنل(SIGINT،sig_handler)؛ // رجسٹر سگنل ہینڈلر۔
کے لیے(intمیں=؛؛میں++۔){ // لامحدود لوپ۔
پرنٹ ایف ('٪ d: مین فنکشن کے اندر۔n'،میں)؛
نیند()؛ // 1 سیکنڈ کے لیے تاخیر۔
}
واپسی ؛
}

Example3.c کے آؤٹ پٹ کے اسکرین شاٹ میں ، ہم دیکھ سکتے ہیں کہ جب صارف نے پہلی بار Ctrl+C ٹائپ کیا تو ہینڈلر فنکشن کی درخواست کی گئی۔ ہینڈلر فنکشن میں ، سگنل ہینڈلر دوبارہ رجسٹر ہوتا ہے۔ SIG_DFL سگنل کی ڈیفالٹ کارروائی کے لیے جب صارف نے دوسری بار Ctrl+C ٹائپ کیا تو یہ عمل ختم کر دیا گیا جو کہ پہلے سے طے شدہ عمل ہے۔ SIGINT سگنل

سگنل بھیجنا:

ایک عمل واضح طور پر خود کو یا کسی دوسرے عمل کو سگنل بھیج سکتا ہے۔ رزلٹ () اور کِل () فنکشن سگنل بھیجنے کے لیے استعمال کیا جا سکتا ہے۔ دونوں افعال کو سگنل ڈاٹ ہیڈر فائل میں قرار دیا گیا ہے۔

int بلند کرنا (intنشان)

رائز () فنکشن سگنل بھیجنے کے لیے استعمال ہوتا ہے۔ نشان کالنگ کے عمل کے لیے (خود) کامیاب ہونے پر یہ صفر لوٹتا ہے اور اگر یہ ناکام ہو جاتا ہے تو ایک نان زیرو ویلیو۔

intمار ڈالو(pid_t pid، intنشان)

کِل فنکشن سگنل بھیجنے کے لیے استعمال ہوتا ہے۔ نشان کی طرف سے مخصوص ایک عمل یا عمل گروپ کے لیے پی آئی ڈی .

SIGUSR1 سگنل ہینڈلر کی مثال

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

باطلsig_handler(intنشان){
پرنٹ ایف ('ہینڈلر فنکشن کے اندر۔n')؛
}

intمرکزی(){
سگنل(SIGUSR1۔،sig_handler)؛ // رجسٹر سگنل ہینڈلر۔
پرنٹ ایف ('مین فنکشن کے اندر۔n')؛
بلند کرنا (SIGUSR1۔)؛
پرنٹ ایف ('مین فنکشن کے اندر۔n')؛
واپسی ؛
}

یہاں ، عمل SIGUSR1 سگنل بھیجتا ہے رائز () فنکشن کا استعمال کرتے ہوئے۔

قتل مثال پروگرام کے ساتھ اٹھائیں۔

#شامل کریں
#شامل کریں
#شامل کریں
باطلsig_handler(intنشان){
پرنٹ ایف ('ہینڈلر فنکشن کے اندر۔n')؛
}

intمرکزی(){
pid_t pid؛
سگنل(SIGUSR1۔،sig_handler)؛ // رجسٹر سگنل ہینڈلر۔
پرنٹ ایف ('مین فنکشن کے اندر۔n')؛
پی آئی ڈی=getpid()؛ // خود عمل کی شناخت۔
مار ڈالو(پی آئی ڈی،SIGUSR1۔)؛ // خود کو SIGUSR1 بھیجیں۔
پرنٹ ایف ('مین فنکشن کے اندر۔n')؛
واپسی ؛
}

یہاں ، عمل بھیجتا ہے۔ SIGUSR1۔ خود استعمال کرنے کا اشارہ۔ قتل () فنکشن getpid () خود عمل کی شناخت حاصل کرنے کے لیے استعمال کیا جاتا ہے۔

اگلی مثال میں ہم دیکھیں گے کہ والدین اور بچے کس طرح بات چیت کرتے ہیں (انٹر پروسیس کمیونیکیشن) استعمال کرتے ہوئے۔ قتل () اور سگنل فنکشن

سگنلز کے ساتھ والدین کے بچے کی بات چیت

#شامل کریں
#شامل کریں
#شامل کریں
#شامل کریں
باطلsig_handler_parent(intنشان){
پرنٹ ایف (والدین: بچے سے جوابی سگنل موصول ہوا۔n')؛
}

باطلsig_handler_child(intنشان){
پرنٹ ایف (بچہ: والدین سے سگنل موصول ہوا۔n')؛
نیند()؛
مار ڈالو(گیٹ پیڈ()،SIGUSR1۔)؛
}

intمرکزی(){
pid_t pid؛
اگر((پی آئی ڈی=کانٹا())<){
پرنٹ ایف (فورک ناکامn')؛
باہر نکلیں ()؛
}
/ * بچوں کا عمل */
اور اگر(پی آئی ڈی==){
سگنل(SIGUSR1۔،sig_handler_child)؛ // رجسٹر سگنل ہینڈلر۔
پرنٹ ایف (بچہ: سگنل کا انتظار۔n')؛
توقف()؛
}
/ * والدین کا عمل */
اور{
سگنل(SIGUSR1۔،sig_handler_parent)؛ // رجسٹر سگنل ہینڈلر۔
نیند()؛
پرنٹ ایف (والدین: بچے کو سگنل بھیجنا۔n')؛
مار ڈالو(پی آئی ڈی،SIGUSR1۔)؛
پرنٹ ایف (والدین: جواب کے منتظر۔n')؛
توقف()؛
}
واپسی ؛
}

یہاں ، کانٹا () فنکشن چائلڈ پروسیس بناتا ہے اور چائلڈ پروسیس پر زیرو لوٹتا ہے اور چائلڈ پروسیس آئی ڈی والدین کے پروسیس میں۔ لہذا ، والدین اور بچے کے عمل کا فیصلہ کرنے کے لیے پی آئی ڈی کو چیک کیا گیا ہے۔ والدین کے عمل میں ، یہ 1 سیکنڈ تک سویا جاتا ہے تاکہ بچہ عمل سگنل ہینڈلر فنکشن کو رجسٹر کر سکے اور والدین سے سگنل کا انتظار کر سکے۔ 1 سیکنڈ والدین کے عمل کے بعد بھیجیں۔ SIGUSR1۔ بچے کے عمل کا اشارہ اور بچے کی طرف سے جوابی سگنل کا انتظار کریں۔ بچے کے عمل میں ، پہلے یہ والدین سے سگنل کا انتظار کر رہا ہوتا ہے اور جب سگنل موصول ہوتا ہے ، ہینڈلر فنکشن طلب کیا جاتا ہے۔ ہینڈلر فنکشن سے ، بچے کا عمل دوسرا بھیجتا ہے۔ SIGUSR1۔ والدین کو اشارہ یہاں۔ getppid () فنکشن پیرنٹ پروسیس ID حاصل کرنے کے لیے استعمال ہوتا ہے۔

نتیجہ

لینکس میں سگنل ایک بڑا موضوع ہے۔ اس آرٹیکل میں ہم نے دیکھا ہے کہ کس طرح بہت ہی بنیادی سے سگنل کو سنبھالنا ہے ، اور یہ بھی جاننا ہے کہ سگنل کیسے پیدا ہوتا ہے ، ایک عمل خود کو اور دوسرے عمل کو سگنل کیسے بھیج سکتا ہے ، سگنل کو بین عمل کے مواصلات کے لیے کیسے استعمال کیا جا سکتا ہے۔