中斷系統
跟PHP沒有關係啊,不過PHP官方的pcntl擴充套件支援了,一般把正在執行的程式稱為主程式,當中斷源【比如鍵盤按下ctrl+c,ctrl+z等產生的硬體中斷事件】發起一箇中斷請求事件【中斷訊號】,主程式會接受這個中斷請求並停止當前正在執行的程式,然後轉到中斷服務程式去執行【中斷響應】,中斷服務程式也稱為中斷處理程式,程式打斷的地方稱為斷點,中斷服務程式處理完成後返回斷點處繼續執行,稱為中斷返回。
以上就是一個完整的中斷處理過程。
中斷源
硬體產生的中斷:鍵盤【大部分人只能接觸這些啦,如ctrl_c,ctrl+z產生的中斷SIGINT,SIGTSTP等】
軟體產生的中斷:某個程式的子程式退出產生中斷,定時訊號,或是通過kill發出的中斷或是在一個程式向另一個程式發出的中斷,檔案描述符變化產生中斷等。
中斷訊號:
訊號列表說明
中斷處理:
1、執行預設動作
2、忽略
3、執行使用者自定義的訊號處理函式 【捕獲】
中斷訊號的處理例子【PHP手冊】
echo "安裝訊號處理器...\n";
pcntl_signal(SIGHUP, function($signo) {//中斷處理程式
echo "訊號處理器被呼叫\n";
});
echo "為自己生成SIGHUP訊號...\n";
posix_kill(posix_getpid(), SIGHUP);//產生中斷請求
echo "分發...\n";
pcntl_signal_dispatch();
echo "完成\n";
訊號集和阻塞:
1、訊號遞達時處理的動作
2、訊號未決集
3、訊號阻塞集
程式可以選擇阻塞某個訊號,阻塞的訊號,當產生時將會放在未決集,除非已經解除阻塞,才能捕獲到。
訊號集操作
1、初始化一個訊號集 【sigemptyset】
2、新增/刪除訊號 【sigaddset,sigdelset】
3、判斷某個訊號是否屬於某個集合裡 【sigismember】
4、訊號集阻塞函式 sigprocmask 【pcntl_sigprocmask】
5、未決訊號集sigpending
6、訊號處理函式signal,sigaction【pcntl_signal】
訊號阻塞測試:【訊號無法遞達,只能在未決集合裡,可以檢視/proc/PID/status對訊號的處理】
檢測一個程式是否存在【向程式組傳送訊號】
posix_kill(posix_getpid(), 0);
訊號【軟中斷】的侷限性:
1、訊號的系統開銷太大。
2、傳送訊號的程式要進行系統呼叫。
3、核心要中斷接受訊號的程式,而且要管理它的堆疊,同時還要呼叫處理程式,後之還要恢復被執行的中斷的程式。
4、訊號的數量非常有限【linux支援64個】
5、訊號能傳輸的資訊量非常有限,使用者產生的訊號不能附加各種資訊及引數。
訊號僅用於程式間的事件通知!!!
更多訊號高階知識請自行google【^_^】