PHP 訊號中斷系統

勺顛顛發表於2019-08-27

中斷系統
PHP訊號中斷系統
跟PHP沒有關係啊,不過PHP官方的pcntl擴充套件支援了,一般把正在執行的程式稱為主程式,當中斷源【比如鍵盤按下ctrl+c,ctrl+z等產生的硬體中斷事件】發起一箇中斷請求事件【中斷訊號】,主程式會接受這個中斷請求並停止當前正在執行的程式,然後轉到中斷服務程式去執行【中斷響應】,中斷服務程式也稱為中斷處理程式,程式打斷的地方稱為斷點,中斷服務程式處理完成後返回斷點處繼續執行,稱為中斷返回。

以上就是一個完整的中斷處理過程。

中斷源
硬體產生的中斷:鍵盤【大部分人只能接觸這些啦,如ctrl_c,ctrl+z產生的中斷SIGINT,SIGTSTP等】
軟體產生的中斷:某個程式的子程式退出產生中斷,定時訊號,或是通過kill發出的中斷或是在一個程式向另一個程式發出的中斷,檔案描述符變化產生中斷等。

中斷訊號:
PHP訊號中斷系統
訊號的含義請google檢視【我不在列出了】

中斷處理:
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";

PHP訊號中斷系統

訊號集和阻塞:
1、訊號遞達時處理的動作
2、訊號未決集
3、訊號阻塞集

程式可以選擇阻塞某個訊號,阻塞的訊號,當產生時將會放在未決集,除非已經解除阻塞,才能捕獲到。
訊號集操作
1、初始化一個訊號集 【sigemptyset】
2、新增/刪除訊號 【sigaddset,sigdelset】
3、判斷某個訊號是否屬於某個集合裡 【sigismember】
4、訊號集阻塞函式 sigprocmask 【pcntl_sigprocmask】
5、未決訊號集sigpending
6、訊號處理函式signal,sigaction【pcntl_signal】

訊號阻塞測試:【訊號無法遞達,只能在未決集合裡,可以檢視/proc/PID/status對訊號的處理】
PHP 訊號中斷系統

檢測一個程式是否存在【向程式組傳送訊號】
posix_kill(posix_getpid(), 0);

更多訊號高階知識請自行google【^_^】

相關文章