您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關PHP中怎么實現一個信號中斷系統,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
中斷系統跟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、信號能傳輸的信息量非常有限,用戶產生的信號不能附加各種信息及參數。
上述就是小編為大家分享的PHP中怎么實現一個信號中斷系統了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。