¶øÔÚ Linux ϵͳÖУ¬Òì²½ÐźŵĴ¦Àí»úÖÆÓÈΪǿ´óºÍÁé»î£¬Îª²¢·¢±à³ÌÌṩÁËÇ¿ÓÐÁ¦µÄÖ§³Ö
±¾ÎĽ«ÉîÈë̽ÌÖ Linux Òì²½ÐźŵÄÔÀí¡¢Ê¹Ó÷½·¨ºÍʵ¼ÊÓ¦Ó㬽ÒʾÆäÔÚ²¢·¢±à³ÌÖеľ޴óDZÁ¦
Ò»¡¢Òì²½ÐźŸÅÊö ÐźÅÊÇ Unix ºÍÀà Unix ϵͳ£¨Èç Linux£©ÖÐÓÃÓÚ½ø³Ì¼äͨÐŵÄÒ»ÖÖ»úÖÆ
ÐźſÉÒÔÊÇͬ²½µÄ£¨ÈçÓÉ `kill` ÃüÁî·¢ËÍ£©£¬Ò²¿ÉÒÔÊÇÒì²½µÄ£¨ÈçÓÉÓ²¼þÖжϴ¥·¢£©
ͬ²½ÐźÅͨ³£ÊÇ¿ÉÒÔÔ¤²âµÄ£¬¶øÒì²½ÐźÅÔò¿ÉÄÜÔÚ³ÌÐòÖ´ÐеÄÈκÎʱ¿Ìµ½´ï
Linux ϵͳ¶¨ÒåÁ˶àÖÖÐźţ¬Ã¿ÖÖÐźŶÔÓ¦²»Í¬µÄʼþ»òÌõ¼þ
ÀýÈ磬`SIGINT` ±íʾÓû§Öжϣ¨Í¨³£ÓÉ Ctrl+C ²úÉú£©£¬`SIGTERM` ±íʾÇëÇó³ÌÐòÖÕÖ¹£¬¶ø`SIGSEGV` Ôò±íʾ¶Î´íÎ󣨷ÃÎÊ·Ç·¨Äڴ棩
Òì²½ÐźŵÄÌØµãÔÚÓÚÆä²»¿ÉÔ¤²âÐÔ£¬ÕâʹµÃ³ÌÐòÔÚ´¦ÀíÕâЩÐźÅʱ±ØÐë¾ß±¸¸ß¶ÈµÄ³°ôÐԺͽ¡×³ÐÔ
Linux ͨ¹ý¸´ÔÓµÄÐźŴ¦Àí»úÖÆ£¬È·±£³ÌÐòÄܹ»ÔÚ½ÓÊÕµ½Òì²½ÐźÅʱÕýÈ·µØÖ´ÐÐÏàÓ¦µÄ´¦Àíº¯Êý£¬Í¬Ê±×îС»¯¶Ô³ÌÐòÕý³£Ö´ÐÐÁ÷³ÌµÄÓ°Ïì
¶þ¡¢Linux Òì²½ÐźŴ¦Àí»úÖÆ Linux Òì²½ÐźŴ¦Àí»úÖÆµÄºËÐÄÔÚÓÚÐźŴ¦Àíº¯Êý£¨signal handler£©ºÍÐźÅÑÚÂ루signal mask£©
1.ÐźŴ¦Àíº¯Êý ÐźŴ¦Àíº¯ÊýÊdzÌÐòÔÚ½ÓÊÕµ½Ìض¨ÐźÅʱҪִÐеĴúÂë¿é
ÔÚ Linux ÖУ¬¿ÉÒÔʹÓà `signal()`»ò `sigaction()` º¯ÊýÀ´ÉèÖÃÐźŴ¦Àíº¯Êý
`sigaction()`ÌṩÁ˸üÇ¿´óµÄ¹¦Äܺ͸üÏêϸµÄ¿ØÖÆ£¬Òò´ËÔÚʵ¼Ê¿ª·¢ÖиüΪ³£ÓÃ
c struct sigaction sa; sa.sa_handler = signal_handler; // ÉèÖÃÐźŴ¦Àíº¯Êý sa.sa_flags = 0; // ĬÈÏΪÕý³£ÐźŴ¦Àí sigemptyset(&sa.sa_mask); // Çå¿ÕÐźż¯ sigaction(SIGINT, &sa,NULL); // ×¢²áÐźŴ¦Àíº¯Êý ÔÚÉÏÃæµÄ´úÂëÖУ¬`signal_handler` ÊÇ´¦Àí`SIGINT`Ðźŵĺ¯Êý
µ±³ÌÐò½ÓÊÕµ½ `SIGINT` ÐźÅʱ£¬`signal_handler` ½«±»µ÷ÓÃ
2.ÐźÅÑÚÂë ÐźÅÑÚÂëÓÃÓÚÔÝʱ×èÈûÐźŵĴ«µÝ
µ±Ò»¸öÐźű»×èÈûʱ£¬¼´Ê¹¸ÃÐźŵ½´ï£¬ÏµÍ³Ò²²»»áÁ¢¼´½«Æä´«µÝ¸ø½ø³Ì
ÕâÔÊÐí³ÌÐòÔÚÌØ¶¨´úÂë¶ÎÄÚÔÝʱºöÂÔijЩÐźţ¬´Ó¶ø±ÜÃâÐźŴ¦Àí¶Ô³ÌÐòÖ´ÐÐÁ÷³ÌµÄ¸ÉÈÅ
Linux ÌṩÁË`sigprocmask()` º¯ÊýÀ´ÉèÖúͲéѯ½ø³ÌµÄÐźÅÑÚÂë
c sigset_t mask; sigemptyset(&mask); sigaddset(&mask, SIGINT); // Ìí¼Ó SIGINT µ½Ðźż¯ sigprocmask(SIG_BLOCK, &mask,NULL); // ×èÈû SIGINT ÔÚÉÏÊö´úÂëÖУ¬³ÌÐòͨ¹ý`sigprocmask()`º¯Êý×èÈûÁË`SIGINT` Ðźţ¬Ê¹µÃÔڸôúÂë¶ÎÄÚ¼´Ê¹°´Ï Ctrl+C£¬³ÌÐòÒ²²»»áÁ¢¼´ÏìÓ¦
Èý¡¢Òì²½ÐźŵÄÌôÕ½ÓëÓ¦¶Ô²ßÂÔ ¾¡¹Ü Linux Òì²½ÐźŴ¦Àí»úÖÆÇ¿´óÇÒÁé»î£¬µ«ÔÚʵ¼ÊʹÓÃÖÐÈÔÃæÁÙһЩÌôÕ½
1.ÐźŴ¦Àíº¯ÊýµÄ¿É¿¿ÐÔ ÓÉÓÚÒì²½ÐźŵIJ»¿ÉÔ¤²âÐÔ£¬ÐźŴ¦Àíº¯ÊýµÄÖ´ÐпÉÄÜ·¢ÉúÔÚ³ÌÐòµÄÈκÎλÖ㬰üÀ¨ÁÙ½çÇø»ò²»¿ÉÖØÈë´úÂëÖÐ
Õâ¿ÉÄܵ¼Ö³ÌÐò±ÀÀ£»òÊý¾Ý²»Ò»ÖÂ
Ó¦¶Ô²ßÂÔ°üÀ¨£º - È·±£ÐźŴ¦Àíº¯Êý¾¡¿ÉÄܼòµ¥ºÍ¿ìËÙÖ´ÐÐ
- ±ÜÃâÔÚÐźŴ¦Àíº¯ÊýÖе÷Óò»¿ÉÖØÈ뺯Êý£¨Èç `malloc()`¡¢`printf()` µÈ£©
- ʹÓÃÈ«¾Ö±äÁ¿»òÔ×Ó²Ù×÷À´Í¬²½ÐźŴ¦Àíº¯ÊýºÍÖ÷³ÌÐòÖ®¼äµÄÊý¾Ý·ÃÎÊ
2.ÐźÅÓëÏß³Ì ÔÚ¶àÏ̳߳ÌÐòÖУ¬ÐźŴ¦Àí±äµÃ¸ü¼Ó¸´ÔÓ
ÒòΪÐźſÉÄÜ´«µÝ¸øÈÎÒâỊ̈߳¬¶øÏß³ÌÖ®¼äµÄͬ²½ºÍͨÐÅ»úÖÆ¿ÉÄÜÊܵ½ÐźŴ¦ÀíµÄÓ°Ïì
Ó¦¶Ô²ßÂÔ°üÀ¨£º -ʹÓà `pthread_sigmask()` ÎªÌØ¶¨Ïß³ÌÉèÖÃÐźÅÑÚÂë
-ʹÓà `sigaction()`µÄ `SA_SIGINFO`±êÖ¾À´½ÓÊÕ°üº¬Ïß³Ì ID µÄÐźÅÐÅÏ¢£¬´Ó¶øÈ·¶¨ÐźŵÄÄ¿±êÏß³Ì
- ÔÚÐźŴ¦Àíº¯ÊýÖнöÖ´ÐÐḬ̈߳²È«µÄ²Ù×÷
ËÄ¡¢Òì²½ÐźŵÄʵ¼ÊÓ¦Óà Linux Òì²½ÐźÅÔÚ²¢·¢±à³ÌÖоßÓй㷺µÄÓ¦Óó¡¾°£¬°üÀ¨µ«²»ÏÞÓÚÒÔϼ¸¸ö·½Ã棺 1.ÓÅÑŵØÖÕÖ¹³ÌÐò ͨ¹ý·¢ËÍ `SIGTERM` Ðźţ¬¿ÉÒÔÇëÇó³ÌÐòÓÅÑŵØÖÕÖ¹£¬¶ø²»ÊÇÁ¢¼´É±ËÀ½ø³Ì
ÕâÔÊÐí³ÌÐòÔÚÍ˳öǰÊÍ·Å×ÊÔ´¡¢±£´æ×´Ì¬»òÖ´ÐÐÆäËûÇåÀí¹¤×÷
2.´¦ÀíÓ²¼þÖÐ¶Ï ÔÚǶÈëʽϵͳ»òÇý¶¯³ÌÐò¿ª·¢ÖУ¬Ó²¼þÖжÏͨ³£Í¨¹ýÒì²½ÐźÅÀ´Í¨Öª½ø³Ì
ÀýÈ磬µ±ÍøÂçÊý¾Ý°üµ½´ïʱ£¬Íø¿¨Çý¶¯³ÌÐò¿ÉÄÜͨ¹ý·¢ËÍÐźÅÀ´Í¨Öª½ÓÊÕ½ø³Ì
3.ʵÏÖ¶¨Ê±Æ÷¹¦ÄÜ Í¨¹ý`SIGALRM` ÐźźÍ`alarm()` º¯Êý£¬¿ÉÒÔʵÏÖ¼òµ¥µÄ¶¨Ê±Æ÷¹¦ÄÜ
µ±¶¨Ê±Æ÷³¬Ê±Ê±£¬ÏµÍ³·¢ËÍ `SIGALRM` ÐźŸø½ø³Ì£¬´Ó¶ø´¥·¢ÏàÓ¦µÄ´¦Àíº¯Êý
4.½ø³Ì¼äͬ²½ÓëͨÐÅ ËäÈ»ÐźŲ»Êǽø³Ì¼äͨÐŵÄÖ÷ÒªÊֶΣ¬µ«ÔÚijЩÇé¿öÏ£¬Í¨¹ý·¢ËͺͽÓÊÕÐźſÉÒÔʵÏÖ½ø³Ì¼äµÄͬ²½ºÍͨÐÅ
ÀýÈ磬¸¸½ø³Ì¿ÉÒÔͨ¹ý·¢ËÍÐźÅÀ´Í¨Öª×Ó½ø³Ìij¸öʼþÒѾ·¢Éú
Îå¡¢×ܽá Linux Òì²½ÐźŴ¦Àí»úÖÆÎª²¢·¢±à³ÌÌṩÁËÇ¿´óµÄÖ§³Ö
ͨ¹ýºÏÀíÉèÖÃÐźŴ¦Àíº¯ÊýºÍÐźÅÑÚÂ룬³ÌÐò¿ÉÒÔÔÚ½ÓÊÕµ½Òì²½ÐźÅʱ²ÉÈ¡Êʵ±µÄÐж¯£¬Í¬Ê±±£³Ö³ÌÐòµÄÎȶ¨ÐԺͿɿ¿ÐÔ
È»¶ø£¬Òì²½ÐźŵĴ¦ÀíÒ²ÃæÁÙһЩÌôÕ½£¬ÐèÒª¿ª·¢ÕßÔÚÉè¼ÆºÍʵÏÖʱ³ä·Ö¿¼ÂDz¢²ÉÈ¡ÏàÓ¦µÄÓ¦¶Ô²ßÂÔ
Ëæ×Ų¢·¢±à³ÌÔÚÏÖ´úÈí¼þ¿ª·¢ÖÐµÄÆÕ¼°£¬ÕÆÎÕ Linux Òì²½ÐźŴ¦Àí»úÖÆ½«³ÉΪ¿ª·¢Õ߱ر¸µÄ¼¼ÄÜÖ®Ò»
ͨ¹ýÉîÈëÀí½âÆäÔÀíºÍÓ¦Óó¡¾°£¬¿ª·¢Õß¿ÉÒÔ¸ü¼Ó¸ßЧµØÀûÓÃÕâÒ»»úÖÆÀ´¹¹½¨¸ßÐÔÄÜ¡¢¸ß¿É¿¿ÐԵIJ¢·¢³ÌÐò