您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)PHP中怎么實現(xiàn)一個信號中斷系統(tǒng),文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
中斷系統(tǒng)跟PHP沒有關(guān)系啊,不過PHP官方的pcntl擴展支持了,一般把正在執(zhí)行的程序稱為主程序,當(dāng)中斷源【比如鍵盤按下ctrl+c,ctrl+z等產(chǎn)生的硬件中斷事件】發(fā)起一個中斷請求事件【中斷信號】,主程序會接受這個中斷請求并停止當(dāng)前正在運行的程序,然后轉(zhuǎn)到中斷服務(wù)程序去運行【中斷響應(yīng)】,中斷服務(wù)程序也稱為中斷處理程序,程序打斷的地方稱為斷點,中斷服務(wù)程序處理完成后返回斷點處繼續(xù)執(zhí)行,稱為中斷返回。
以上就是一個完整的中斷處理過程。
中斷源
硬件產(chǎn)生的中斷:鍵盤【大部分人只能接觸這些啦,如ctrl_c,ctrl+z產(chǎn)生的中斷SIGINT,SIGTSTP等】
軟件產(chǎn)生的中斷:某個進(jìn)程的子進(jìn)程退出產(chǎn)生中斷,定時信號,或是通過kill發(fā)出的中斷或是在一個進(jìn)程向另一個進(jìn)程發(fā)出的中斷,文件描述符變化產(chǎn)生中斷等。
中斷信號:
信號列表說明
中斷處理:
1、執(zhí)行默認(rèn)動作
2、忽略
3、執(zhí)行用戶自定義的信號處理函數(shù) 【捕獲】
中斷信號的處理例子【PHP手冊】
echo "安裝信號處理器...\n";
pcntl_signal(SIGHUP, function($signo) {//中斷處理程序
echo "信號處理器被調(diào)用\n";
});
echo "為自己生成SIGHUP信號...\n";
posix_kill(posix_getpid(), SIGHUP);//產(chǎn)生中斷請求
echo "分發(fā)...\n";
pcntl_signal_dispatch();
echo "完成\n";
信號集和阻塞:
1、信號遞達(dá)時處理的動作
2、信號未決集
3、信號阻塞集
進(jìn)程可以選擇阻塞某個信號,阻塞的信號,當(dāng)產(chǎn)生時將會放在未解決集,除非已經(jīng)解除阻塞,才能捕獲到。
信號集操作
1、初始化一個信號集 【sigemptyset】
2、添加/刪除信號 【sigaddset,sigdelset】
3、判斷某個信號是否屬于某個集合里 【sigismember】
4、信號集阻塞函數(shù) sigprocmask 【pcntl_sigprocmask】
5、未決信號集sigpending
6、信號處理函數(shù)signal,sigaction【pcntl_signal】
信號阻塞測試:【信號無法遞達(dá),只能在未決集合里,可以查看/proc/PID/status對信號的處理】
檢測一個進(jìn)程是否存在【向進(jìn)程組發(fā)送信號】
posix_kill(posix_getpid(), 0);
信號【軟中斷】的局限性:
1、信號的系統(tǒng)開銷太大。
2、發(fā)送信號的進(jìn)程要進(jìn)行系統(tǒng)調(diào)用。
3、內(nèi)核要中斷接受信號的進(jìn)程,而且要管理它的堆棧,同時還要調(diào)用處理程序,后之還要恢復(fù)被執(zhí)行的中斷的進(jìn)程。
4、信號的數(shù)量非常有限【linux支持64個】
5、信號能傳輸?shù)男畔⒘糠浅S邢?,用戶產(chǎn)生的信號不能附加各種信息及參數(shù)。
上述就是小編為大家分享的PHP中怎么實現(xiàn)一個信號中斷系統(tǒng)了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。