சி மொழியில் சிக்னல் கையாளுபவர்களை எவ்வாறு பயன்படுத்துவது?

How Use Signal Handlers C Language



இந்த கட்டுரையில் C மொழியைப் பயன்படுத்தி லினக்ஸில் சிக்னல் ஹேண்ட்லர்களை எவ்வாறு பயன்படுத்துவது என்பதை நாங்கள் உங்களுக்குக் காண்பிக்கப் போகிறோம். ஆனால் முதலில் சமிக்ஞை என்றால் என்ன, அது உங்கள் திட்டத்தில் நீங்கள் பயன்படுத்தக்கூடிய சில பொதுவான சமிக்ஞைகளை எவ்வாறு உருவாக்கும், பின்னர் நிரல் செயல்படும் போது ஒரு நிரலால் பல்வேறு சமிக்ஞைகளை எவ்வாறு கையாள முடியும் என்று பார்ப்போம். எனவே, ஆரம்பிக்கலாம்.

சமிக்ஞை

ஒரு சமிக்ஞை என்பது ஒரு செயல்முறை அல்லது நூலை சில முக்கியமான சூழ்நிலை வந்துவிட்டது என்பதை அறிவிக்க உருவாக்கப்பட்ட ஒரு நிகழ்வு ஆகும். ஒரு செயல்முறை அல்லது நூல் ஒரு சமிக்ஞையைப் பெறும்போது, ​​செயல்முறை அல்லது நூல் அது செய்வதை நிறுத்தி சில நடவடிக்கைகளை எடுக்கும். சிக்னல் இடை-செயல்முறை தொடர்புக்கு பயனுள்ளதாக இருக்கலாம்.







நிலையான சமிக்ஞைகள்

சமிக்ஞைகள் தலைப்பு கோப்பில் வரையறுக்கப்பட்டுள்ளன சமிக்ஞை. h ஒரு மேக்ரோ மாறிலி. சமிக்ஞை பெயர் ஒரு SIG உடன் தொடங்கியது மற்றும் சிக்னலின் சுருக்கமான விளக்கத்தைத் தொடர்ந்து வருகிறது. எனவே, ஒவ்வொரு சிக்னலுக்கும் தனித்துவமான எண் மதிப்பு உள்ளது. உங்கள் புரோகிராம் எப்போதும் சிக்னல்களின் பெயரைப் பயன்படுத்த வேண்டும், சிக்னல் எண் அல்ல. காரணம் கணினிக்கு ஏற்ப சமிக்ஞை எண் வேறுபடலாம் ஆனால் பெயர்களின் பொருள் தரமாக இருக்கும்.



மேக்ரோ என்எஸ்ஐஜி வரையறுக்கப்பட்ட சமிக்ஞையின் மொத்த எண்ணிக்கை. மதிப்பு என்எஸ்ஐஜி வரையறுக்கப்பட்ட மொத்த சமிக்ஞையின் எண்ணிக்கையை விட அதிகமாகும் (அனைத்து சமிக்ஞை எண்களும் தொடர்ச்சியாக ஒதுக்கப்படுகின்றன).



நிலையான சமிக்ஞைகள் பின்வருமாறு:





சிக்னல் பெயர் விளக்கம்
SIGHUP செயல்முறையை நிறுத்துங்கள். SIGHUP சமிக்ஞை பயனரின் முனையத்தின் துண்டிக்கப்படுதலைப் புகாரளிக்கப் பயன்படுகிறது, ஒருவேளை தொலைதூர இணைப்பு தொலைந்தாலோ அல்லது செயலிழந்ததாலோ இருக்கலாம்.
அடையாளம் செயல்முறையை குறுக்கிடுங்கள். பயனர் INTR எழுத்தை தட்டச்சு செய்யும் போது (பொதுவாக Ctrl + C) SIGINT சமிக்ஞை அனுப்பப்படும்.
சிக்யூட் செயல்முறையை விட்டு விடுங்கள். பயனர் QUIT எழுத்தை தட்டச்சு செய்யும் போது (பொதுவாக Ctrl + ) SIGQUIT சமிக்ஞை அனுப்பப்படும்.
சீல் சட்டவிரோத அறிவுறுத்தல். குப்பை அல்லது சலுகை அறிவுறுத்தலை செயல்படுத்த முயற்சி செய்யும்போது, ​​SIGILL சிக்னல் உருவாக்கப்படுகிறது. மேலும், ஸ்டாக் நிரம்பும்போது அல்லது சிக்னல் ஹேண்ட்லரை இயக்குவதில் சிக்கல் இருக்கும்போது SIGILL உருவாக்க முடியும்.
SIGTRAP ட்ரேஸ் ட்ராப். ஒரு பிரேக் பாயிண்ட் அறிவுறுத்தல் மற்றும் பிற பொறி அறிவுறுத்தல்கள் SIGTRAP சமிக்ஞையை உருவாக்கும். பிழைதிருத்தி இந்த சமிக்ஞையைப் பயன்படுத்துகிறது.
SIGABRT நிறுத்து Abort () செயல்பாடு அழைக்கப்படும் போது SIGABRT சமிக்ஞை உருவாக்கப்படுகிறது. இந்த சமிக்ஞை நிரலால் கண்டறியப்பட்ட மற்றும் பிழை () செயல்பாட்டு அழைப்பால் அறிவிக்கப்பட்ட பிழையைக் குறிக்கிறது.
SIGFPE மிதக்கும் புள்ளி விதிவிலக்கு. ஒரு அபாயகரமான எண்கணித பிழை ஏற்பட்டால், SIGFPE சமிக்ஞை உருவாக்கப்பட்டது.
SIGUSR1 மற்றும் SIGUSR2 SIGUSR1 மற்றும் SIGUSR2 சிக்னல்களை நீங்கள் விரும்பியபடி பயன்படுத்தலாம். எளிய இடை-செயல்முறை தொடர்புக்கான சமிக்ஞையைப் பெறும் நிரலில் அவர்களுக்கு ஒரு சமிக்ஞை கையாளுபவரை எழுதுவது பயனுள்ளது.

சமிக்ஞைகளின் இயல்புநிலை நடவடிக்கை

ஒவ்வொரு சமிக்ஞையும் இயல்புநிலை செயலைக் கொண்டுள்ளது, பின்வருவனவற்றில் ஒன்று:

கால: செயல்முறை நிறுத்தப்படும்.
கோர்: செயல்முறை முடிவடைந்து கோர் டம்ப் கோப்பை உருவாக்கும்.
இக்னி: செயல்முறை சமிக்ஞையை புறக்கணிக்கும்.
நிறுத்து: செயல்முறை நிறுத்தப்படும்.
கணக்கு: செயல்முறை நிறுத்தப்படாமல் தொடரும்.



ஹேண்ட்லர் செயல்பாட்டைப் பயன்படுத்தி இயல்புநிலை நடவடிக்கை மாற்றப்படலாம். சில சமிக்ஞைகளின் இயல்புநிலை செயலை மாற்ற முடியாது. சிகில் மற்றும் SIGABRT சிக்னலின் இயல்புநிலை செயலை மாற்றவோ அல்லது புறக்கணிக்கவோ முடியாது.

சிக்னல் கையாளுதல்

ஒரு செயல்முறை ஒரு சமிக்ஞையைப் பெற்றால், செயல்முறைக்கு அந்த வகையான சிக்னலுக்கான செயலின் தேர்வு இருக்கும். செயல்முறை சமிக்ஞையை புறக்கணிக்கலாம், கையாளும் செயல்பாட்டைக் குறிப்பிடலாம் அல்லது அந்த வகையான சமிக்ஞையின் இயல்புநிலை செயலை ஏற்கலாம்.

  • சிக்னலுக்கான குறிப்பிட்ட நடவடிக்கை புறக்கணிக்கப்பட்டால், சிக்னல் உடனடியாக நிராகரிக்கப்படும்.
  • நிரல் போன்ற செயல்பாட்டைப் பயன்படுத்தி ஒரு கையாளுதல் செயல்பாட்டை பதிவு செய்யலாம் சமிக்ஞை அல்லது மூச்சுத்திணறல் . இது ஹேண்ட்லர் சிக்னலைப் பிடிக்கிறது என்று அழைக்கப்படுகிறது.
  • சமிக்ஞை கையாளப்படவில்லை அல்லது புறக்கணிக்கப்படவில்லை என்றால், அதன் இயல்புநிலை நடவடிக்கை நடைபெறுகிறது.

சிக்னலைப் பயன்படுத்தி நாம் கையாள முடியும் சமிக்ஞை அல்லது மூச்சுத்திணறல் செயல்பாடு எப்படி எளிமையானது என்பதை இங்கே பார்க்கலாம் சமிக்ஞை () சமிக்ஞைகளை கையாள இந்த செயல்பாடு பயன்படுத்தப்படுகிறது.

intசமிக்ஞை() (intஅடையாளம், வெற்றிடம் (*செயல்பாடு)(int))

தி சமிக்ஞை () அழைக்கும் செயல்பாடு செயல்முறை ஒரு சமிக்ஞையைப் பெற்றால் செயல்பாடு அடையாளம் . தி சமிக்ஞை () செயல்பாட்டிற்கு ஒரு சுட்டியை அளிக்கிறது செயல்பாடு வெற்றிகரமாக இருந்தால் அல்லது அது ஒரு பிழையை எர்ர்னோ மற்றும் -1 என மாற்றும்.

தி செயல்பாடு சுட்டிக்காட்டி மூன்று மதிப்புகளைக் கொண்டிருக்கலாம்:

  1. SIG_DFL : இது கணினி இயல்புநிலை செயல்பாட்டிற்கான ஒரு சுட்டிக்காட்டி SIG_DFL () , இல் அறிவிக்கப்பட்டது தலைப்பு கோப்பு. சமிக்ஞையின் இயல்புநிலை நடவடிக்கை எடுக்க இது பயன்படுத்தப்படுகிறது.
  2. SIG_IGN : இது கணினி புறக்கணிப்பு செயல்பாட்டிற்கு ஒரு சுட்டிக்காட்டி SIG_IGN () , இல் அறிவிக்கப்பட்டது தலைப்பு கோப்பு.
  3. பயனர் வரையறுக்கப்பட்ட கையாளுதல் செயல்பாடு சுட்டிக்காட்டி : பயனர் வரையறுக்கப்பட்ட கையாளுதல் செயல்பாட்டு வகை வெற்றிடம் (*) (int) , திரும்பும் வகை வெற்றிடமானது மற்றும் வகை எண்ணின் ஒரு வாதம்.

அடிப்படை சிக்னல் ஹேண்ட்லர் உதாரணம்

#சேர்க்கிறது
#சேர்க்கிறது
#சேர்க்கிறது
வெற்றிடம்sig_handler(intஅடையாளம்){

// கையாளுதல் செயல்பாட்டின் திரும்பும் வகை வெற்றிடமாக இருக்க வேண்டும்
printf (' nகையாளுபவர் செயல்பாடு உள்ளே n');
}

intமுக்கிய(){
சமிக்ஞை(அடையாளம்,sig_handler); // சமிக்ஞை கையாளுபவரை பதிவு செய்யவும்
க்கான(intநான்=1;;நான்++){ //முடிவில்லா சுழற்சி
printf ('%d: முக்கிய செயல்பாட்டின் உள்ளே n',நான்);
தூங்கு(1); // 1 வினாடிக்கு தாமதம்
}
திரும்ப 0;
}

Example1.c இன் வெளியீட்டின் ஸ்கிரீன்ஷாட்டில், முக்கிய செயல்பாட்டில் எல்லையற்ற வளையம் செயல்படுவதை நாம் காணலாம். பயனர் Ctrl+C ஐ தட்டச்சு செய்யும் போது, ​​முக்கிய செயல்பாட்டை நிறுத்துதல் மற்றும் சமிக்ஞையின் கையாளுதல் செயல்பாடு அழைக்கப்படும். கையாளுபவர் செயல்பாடு முடிந்ததும், முக்கிய செயல்பாடு செயல்படுத்தல் மீண்டும் தொடங்கியது. பயனர் வகை Ctrl+ என தட்டச்சு செய்யும்போது, ​​செயல்முறை நிறுத்தப்படும்.

சிக்னல்களின் உதாரணத்தை புறக்கணிக்கவும்

#சேர்க்கிறது
#சேர்க்கிறது
#சேர்க்கிறது
intமுக்கிய(){
சமிக்ஞை(அடையாளம்,SIG_IGN); // சிக்னலைப் புறக்கணிப்பதற்காக சிக்னல் ஹேண்ட்லரைப் பதிவு செய்யவும்

க்கான(intநான்=1;;நான்++){ //முடிவில்லா சுழற்சி
printf ('%d: முக்கிய செயல்பாட்டின் உள்ளே n',நான்);
தூங்கு(1); // 1 வினாடிக்கு தாமதம்
}
திரும்ப 0;
}

இங்கே கையாளும் செயல்பாடு பதிவு செய்யப்படுகிறது SIG_IGN () சமிக்ஞை செயலை புறக்கணிப்பதற்கான செயல்பாடு. எனவே, பயனர் Ctrl+C ஐ தட்டச்சு செய்யும் போது, அடையாளம் சமிக்ஞை உருவாக்குகிறது ஆனால் நடவடிக்கை புறக்கணிக்கப்படுகிறது.

சமிக்ஞை கையாளுபவரின் உதாரணத்தை மீண்டும் பதிவு செய்யவும்

#சேர்க்கிறது
#சேர்க்கிறது
#சேர்க்கிறது

வெற்றிடம்sig_handler(intஅடையாளம்){
printf (' nகையாளுபவர் செயல்பாடு உள்ளே n');
சமிக்ஞை(அடையாளம்,SIG_DFL); // இயல்புநிலை நடவடிக்கைக்கு சமிக்ஞை கையாளரை மீண்டும் பதிவு செய்யவும்
}

intமுக்கிய(){
சமிக்ஞை(அடையாளம்,sig_handler); // சமிக்ஞை கையாளுபவரை பதிவு செய்யவும்
க்கான(intநான்=1;;நான்++){ //முடிவில்லா சுழற்சி
printf ('%d: முக்கிய செயல்பாட்டின் உள்ளே n',நான்);
தூங்கு(1); // 1 வினாடிக்கு தாமதம்
}
திரும்ப 0;
}

Example3.c இன் வெளியீட்டின் ஸ்கிரீன்ஷாட்டில், பயனர் முதன்முறையாக Ctrl+C ஐ தட்டச்சு செய்யும் போது, ​​கையாளுபவர் செயல்பாடு அழைக்கப்படுவதை நாம் காணலாம். கையாளுதல் செயல்பாட்டில், சமிக்ஞை கையாளுபவர் மீண்டும் பதிவு செய்கிறார் SIG_DFL சமிக்ஞையின் இயல்புநிலை நடவடிக்கைக்கு. பயனர் Ctrl+C ஐ இரண்டாவது முறையாக தட்டச்சு செய்யும் போது, ​​செயல்முறை முடிவடைகிறது அடையாளம் சமிக்ஞை.

சமிக்ஞைகளை அனுப்புகிறது:

ஒரு செயல்முறை வெளிப்படையாக தனக்கு அல்லது மற்றொரு செயல்முறைக்கு சமிக்ஞைகளை அனுப்ப முடியும். சிக்னல்களை அனுப்ப ரைஸ் () மற்றும் கொல் () செயல்பாட்டைப் பயன்படுத்தலாம். இரண்டு செயல்பாடுகளும் signal.h தலைப்பு கோப்பில் அறிவிக்கப்பட்டுள்ளன.

int உயர்த்த (intஅடையாளம்)

சிக்னலை அனுப்புவதற்கு பயன்படுத்தப்படும் உயர்வு () செயல்பாடு அடையாளம் அழைப்பு செயல்முறைக்கு (தானே). அது வெற்றிகரமாக இருந்தால் பூஜ்ஜியத்தையும், தோல்வியுற்றால் ஒரு nonzero மதிப்பையும் தரும்.

intகொல்ல(pid_t pid, intஅடையாளம்)

சிக்னலை அனுப்ப கொல்லப்பட்ட செயல்பாடு பயன்படுத்தப்படுகிறது அடையாளம் குறிப்பிடப்பட்ட ஒரு செயல்முறை அல்லது செயல்முறை குழுவுக்கு பிட் .

SIGUSR1 சிக்னல் ஹேண்ட்லர் உதாரணம்

#சேர்க்கிறது
#சேர்க்கிறது

வெற்றிடம்sig_handler(intஅடையாளம்){
printf ('உள்ளே கையாளுபவர் செயல்பாடு n');
}

intமுக்கிய(){
சமிக்ஞை(SIGUSR1,sig_handler); // சமிக்ஞை கையாளுபவரை பதிவு செய்யவும்
printf ('முக்கிய செயல்பாடு உள்ளே n');
உயர்த்த (SIGUSR1);
printf ('முக்கிய செயல்பாடு உள்ளே n');
திரும்ப 0;
}

இங்கே, செயல்முறை SIGUSR1 சமிக்ஞையை உயர்வு () செயல்பாட்டைப் பயன்படுத்தி அனுப்புகிறது.

கில் எடுத்துக்காட்டு திட்டத்துடன் உயர்த்தவும்

#சேர்க்கிறது
#சேர்க்கிறது
#சேர்க்கிறது
வெற்றிடம்sig_handler(intஅடையாளம்){
printf ('உள்ளே கையாளுபவர் செயல்பாடு n');
}

intமுக்கிய(){
pid_t pid;
சமிக்ஞை(SIGUSR1,sig_handler); // சமிக்ஞை கையாளுபவரை பதிவு செய்யவும்
printf ('முக்கிய செயல்பாடு உள்ளே n');
பிட்=getpid(); // செயல்முறை ஐடி
கொல்ல(பிட்,SIGUSR1); // SIGUSR1 ஐ தனக்கு அனுப்பவும்
printf ('முக்கிய செயல்பாடு உள்ளே n');
திரும்ப 0;
}

இங்கே, செயல்முறை அனுப்புகிறது SIGUSR1 தன்னைப் பயன்படுத்தி சமிக்ஞை கொல்ல () செயல்பாடு கெட்டிபிட் () அது தன்னை செயல்முறை ஐடி பெற பயன்படுத்தப்படுகிறது.

அடுத்த எடுத்துக்காட்டில் பெற்றோர் மற்றும் குழந்தை செயல்முறைகள் எவ்வாறு தொடர்பு கொள்கின்றன (இன்டர் ப்ராசஸ் கம்யூனிகேஷன்) பயன்படுத்தி பார்க்கலாம் கொல்ல () மற்றும் சமிக்ஞை செயல்பாடு.

சிக்னல்களுடன் பெற்றோர் குழந்தை தொடர்பு

#சேர்க்கிறது
#சேர்க்கிறது
#சேர்க்கிறது
#சேர்க்கிறது
வெற்றிடம்sig_handler_parent(intஅடையாளம்){
printf (பெற்றோர்: குழந்தையிலிருந்து பதில் சிக்னல் கிடைத்தது n');
}

வெற்றிடம்sig_handler_ குழந்தை(intஅடையாளம்){
printf (குழந்தை: பெற்றோரிடமிருந்து ஒரு சமிக்ஞையைப் பெற்றார் n');
தூங்கு(1);
கொல்ல(getppid(),SIGUSR1);
}

intமுக்கிய(){
pid_t pid;
என்றால்((பிட்=முள் கரண்டி())<0){
printf (முட்கரண்டி தோல்வியடைந்தது n');
வெளியேறு (1);
}
/ * குழந்தை செயல்முறை */
வேறு என்றால்(பிட்==0){
சமிக்ஞை(SIGUSR1,sig_handler_ குழந்தை); // சமிக்ஞை கையாளுபவரை பதிவு செய்யவும்
printf (குழந்தை: சிக்னலுக்காக காத்திருக்கிறது n');
இடைநிறுத்து();
}
/ * பெற்றோர் செயல்முறை */
வேறு{
சமிக்ஞை(SIGUSR1,sig_handler_parent); // சமிக்ஞை கையாளுபவரை பதிவு செய்யவும்
தூங்கு(1);
printf ('பெற்றோர்: குழந்தைக்கு சிக்னல் அனுப்புதல் n');
கொல்ல(பிட்,SIGUSR1);
printf (பெற்றோர்: பதிலுக்காக காத்திருக்கிறேன் n');
இடைநிறுத்து();
}
திரும்ப 0;
}

இங்கே, முள் கரண்டி() செயல்பாடு குழந்தை செயல்முறையை உருவாக்குகிறது மற்றும் பூஜ்ஜியத்தை குழந்தை செயல்முறை மற்றும் குழந்தை செயல்முறை ஐடியை பெற்றோர் செயல்முறைக்கு வழங்குகிறது. எனவே, பெற்றோர் மற்றும் குழந்தை செயல்முறையை தீர்மானிக்க பிட் சரிபார்க்கப்பட்டது. பெற்றோர் செயல்பாட்டில், அது 1 வினாடி தூங்குகிறது, இதனால் குழந்தை செயல்முறை சமிக்ஞை கையாளுதல் செயல்பாட்டை பதிவு செய்து பெற்றோரிடமிருந்து சிக்னலுக்காக காத்திருக்கும். 1 வினாடிக்குப் பிறகு பெற்றோர் செயல்முறை அனுப்பவும் SIGUSR1 குழந்தை செயல்முறைக்கு சமிக்ஞை மற்றும் குழந்தை இருந்து பதில் சமிக்ஞை காத்திருக்க. குழந்தை செயல்பாட்டில், முதலில் அது பெற்றோரிடமிருந்து சிக்னலுக்காகக் காத்திருக்கிறது மற்றும் சிக்னல் பெறப்படும்போது, ​​கையாளுபவர் செயல்பாடு அழைக்கப்படுகிறது. கையாளுபவர் செயல்பாட்டிலிருந்து, குழந்தை செயல்முறை இன்னொன்றை அனுப்புகிறது SIGUSR1 பெற்றோருக்கு சமிக்ஞை. இங்கே getppid () பெற்றோர் செயல்முறை ஐடி பெற செயல்பாடு பயன்படுத்தப்படுகிறது.

முடிவுரை

லினக்ஸில் சிக்னல் ஒரு பெரிய தலைப்பு. இந்த கட்டுரையில் சிக்னலை மிக அடிப்படையிலிருந்து எவ்வாறு கையாள்வது என்பதை பார்த்தோம், மேலும் சிக்னல் எவ்வாறு உருவாகிறது, ஒரு செயல்முறை தனக்கு எவ்வாறு சிக்னலை அனுப்ப முடியும் மற்றும் பிற செயல்முறை, இன்டர்-ப்ராசஸ் கம்யூனிகேஷனுக்கு எப்படி சிக்னல் பயன்படுத்த முடியும் என்பதை அறிவோம்.