信号通信
信號(signal)機制是Unix系統中最為古老的進程間通信機制,很多條件可以產生一個信號:
??1、當用戶按某些按鍵時,產生信號
??2、硬件異常產生信號:除數為0、無效的存儲訪問等等。這些情況通常由硬件檢測到,將其通知內核,然后內核產生適當的信號通知進程,例如,內核對正訪問一個無效存儲區的進程產生一個SIGSEGV信號
? ? ? ? ?3、進程用kill函數將信號發送給另一個進程
raise 函數功能:發送信號給自身 函數原型:int raise(int sig) 頭文件:#include <signal.h>
signal 函數作用:設置信號處理方式 函數原型:void (*signal(int signum,void(*handler(int)))(int) typedef ??void(*handler(int) ?signhandler_t signhandler_t signal(int signnum,signhandler_t handler)
#include?<signal.h>?? #include?<stdio.h>?? #include?<stdlib.h>?? ?? void?my_func(int?sign_no)?? {?? ????if(sign_no==SIGINT)?? ????????printf("I?have?get?SIGINT\n");?? ????else?if(sign_no==SIGQUIT)?? ????????printf("I?have?get?SIGQUIT\n");?? }?? ?? ?? int?main()?? {?? ????printf("Waiting?for?signal?SIGINT?or?SIGQUIT?\n?");?? ?????? ????/*注冊信號處理函數*/?? ????signal(SIGINT,?my_func);?? ????signal(SIGQUIT,?my_func);?? ?????? ????pause();?? ????exit(0);?? } ?
??1、當用戶按某些按鍵時,產生信號
??2、硬件異常產生信號:除數為0、無效的存儲訪問等等。這些情況通常由硬件檢測到,將其通知內核,然后內核產生適當的信號通知進程,例如,內核對正訪問一個無效存儲區的進程產生一個SIGSEGV信號
? ? ? ? ?3、進程用kill函數將信號發送給另一個進程
? ? ? ? ?4、用戶可用kill命令將信號發送給其他進程
下面是幾種常見的信號:
§ SIGHUP: 從終端上發出的結束信號
§ SIGINT: 來自鍵盤的中斷信號(Ctrl-C)
§ SIGKILL:該信號結束接收信號的進程,殺死進程
§ SIGTERM:kill 命令發出的信號
§ SIGCHLD:子進程停止或結束時通知父進程
§ SIGSTOP:來自鍵盤(Ctrl-Z)或調試程序的停止執行信號,暫停進程
當某信號出現時,將按照下列三種方式中
的一種進行處理:
1、忽略此信號
大多數信號都按照這種方式進行處理,但有兩種信號
決不能被忽略,它們是:SIGKILL\SIGSTOP。
這兩種信號不能被忽略的原因是:它們向超級用戶提供了一種終止或停止進程的方法
2、執行用戶希望的動作
通知內核在某種信號發生時,調用一個用戶函數。在用戶函數中,執行用戶希望的處理
3、執行系統默認動作
對大多數信號的系統默認動作是終止該進程
發送信號的主要函數有 kill和raise。
? ?區別:
? ? ?Kill既可以向自身發送信號,也可以向其他進程發送信號。與kill函數不同的是,raise函數是向進程自身發送信號
kill 函數作用:傳送信號給指定的進程 函數原型:int kill(pid_t pid,int sig) 函數參數:pid>0 ?指定的進程pid ? pid=0發送給目前進程相同的進程組的所有進程 ? pid=-1 廣播給系統內所有的進程 ? sig ? ? 信號 返回值:成功返回0,出錯返回-1 頭文件:#include <signal.h> ? ? ? #include <sys/types.h>
raise 函數功能:發送信號給自身 函數原型:int raise(int sig) 頭文件:#include <signal.h>
使用alarm函數可以設置一個時間值(鬧鐘時間),當所設置的時間到了時,產生SIGALRM信號.如果不捕捉此信號,則默認動作是終止該進程
alarm 函數作用:設置信號,傳送鬧鐘 函數原型:unsigned int alarm(unsigned int secnds) 返回值:返回之前鬧鐘的剩余秒數,如果之前未設置鬧鐘則返回0 頭文件:#include <signal.h> ? ? ? #include <unistd.h> pause 函數作用:讓進程暫停直到信號出現 函數原型:int pause(void) 返回值:-1
signal 函數作用:設置信號處理方式 函數原型:void (*signal(int signum,void(*handler(int)))(int) typedef ??void(*handler(int) ?signhandler_t signhandler_t signal(int signnum,signhandler_t handler)
下面是例子:
[cpp]?view plain?copy ?
總結
- 上一篇: 管道通信
- 下一篇: 8086指令(II)