国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

php 中的信號處理操作實例詳解

瀏覽:73日期:2022-09-11 10:49:30

本文實例講述了php 中的信號處理操作。分享給大家供大家參考,具體如下:

首先我們需要了解幾個函數

pcntl_signal 安裝信號處理器,也就是當指定信號發生時,調用函數。pcntl_alarm 指定秒數后向進程發送SIGALRM信號。posix_getpid 返回當前進程idposix_kill 給指定進程發送信號

一些常用的信號說明

SIGHUP本信號在用戶終端連接(正常或非正常)結束時發出, 通常是在終端的控制進程結束時,通知同一session內的各個作業, 這時它們與控制終端不再關聯。

SIGINT程序終止(interrupt)信號, 在用戶鍵入INTR字符(通常是Ctrl-C)時發出。

SIGQUIT和SIGINT類似,但由QUIT字符(通常是Ctrl-/)來控制;進程在因收到SIGQUIT退出時會產生core文件,在這個意義上類似于一個程序錯誤信號。

SIGKILL用來立即結束程序的運行。本信號不能被阻塞、處理和忽略。如果管理員發現某個進程終止不了,可嘗試發送這個信號。

SIGTERM程序結束(terminate)信號, 與SIGKILL不同的是該信號可以被阻塞和處理。通常用來要求程序自己正常退出,shell命令kill缺省產生這個信號。如果進程終止不了,我們才會嘗試SIGKILL。

SIGUSR1留給用戶使用

SIGUSR2留給用戶使用

SIGALRM時鐘定時信號, 計算的是實際的時間或時鐘時間。alarm函數使用該信號。

SIGCHLD子進程結束時, 父進程會收到這個信號。

例1:

<?phpdeclare(ticks = 1);//信號處理函數function sig_func() { echo 'child exit rn';}//設置信號處理器pcntl_signal(SIGCHLD, ’sig_func’);$pid = pcntl_fork();if($pid == -1) { die(’fork error’);} else if ($pid) { pcntl_wait($status);} else { echo 'child... rn'; exit;}

當子進程退出時,會向父進程發送SIGCHLD信號,我們通過設置信號處理器,成功的處理信號。

例2:

<?phpdeclare(ticks = 1);//信號處理函數function sig_func($signo) { switch($signo) { case SIGCHLD: { echo 'child SIGCHLD rn'; break; } case SIGTERM: { echo 'child SIGTERM rn'; break; } default: //處理所有其他信號 break; }}//設置信號處理器pcntl_signal(SIGCHLD, ’sig_func’);//設置信號處理器pcntl_signal(SIGTERM, ’sig_func’);$pid = pcntl_fork();if($pid == -1) { die(’fork error’);} else if ($pid) { pcntl_wait($status);} else { sleep(3); echo 'child rn'; sleep(3); posix_kill(getmypid(), SIGTERM); exit;}

父進程等待子進程的退出,子進程等待3秒后輸出child,再等待3秒后向自身發送結束程序信號。

例3:

<?phpdeclare(ticks = 1);//信號處理函數function sig_func($signo) { switch($signo) { case SIGCHLD: { echo 'child SIGCHLD rn'; break; } /*這里要把處理SIGTERM信號的代碼注釋掉 case SIGTERM: { echo 'child SIGTERM rn'; break; }*/ default: //處理所有其他信號 break; }}//設置信號處理器pcntl_signal(SIGCHLD, ’sig_func’);//設置信號處理器,也注釋掉//不然當父進程發向子進程發送SIGTERM信號時,子進程不會退出,還會繼續執行//我們的信號處理函數把SIGTERM給忽略了//pcntl_signal(SIGTERM, ’sig_func’);$pid = pcntl_fork();if($pid == -1) { die(’fork error’);} else if ($pid) { sleep(30); posix_kill($pid, SIGTERM);} else { $cnt = 0; for(;;) { sleep(3); echo $cnt, ’-’; ++$cnt; } exit;}

父進程在等待30秒后,向子進程發送SIGTERM結束程序信號。如果我們設置了SIGTERM信號的處理器,并且在自定義信號處理器中并沒有殺死該進程,則該子進程會一直運行下去。

pcntl_signal()函數僅僅是注冊信號和它的處理方法,真正接收到信號并調用其處理方法的是pcntl_signal_dispatch()函數。

例4:

<?php//使用ticks需要PHP 4.3.0以上版本//declare(ticks = 1);function sig_func() { echo 'SIGALRM rn';}//設置信號處理器pcntl_signal(SIGALRM, ’sig_func’);pcntl_alarm(3);

通過函數pcntl_alarm()3秒后給進程發送SIGALRM信號,但信號處理函數并未調用。原因是我們注釋了declare(ticks = 1);這段代碼,而又沒有調用pcntl_signal_dispatch()函數。

declare(ticks = 1);表示每執行一條低級指令,就檢查一次信號,如果檢測到注冊的信號,就調用其信號處理器。但是這種處理方式效率很低,建議在代碼循環中通過pcntl_signal_dispatch()來處理信號。

<?php//使用ticks需要PHP 4.3.0以上版本//declare(ticks = 1);function sig_func() { echo 'SIGALRM rn';}//設置信號處理器pcntl_signal(SIGALRM, ’sig_func’);pcntl_alarm(3);//因為3秒后pcntl_alarm函數才會給進程發送SIGALRM信號//所以我們通過sleep函數等待3秒后,調用pcntl_signal_dispatch()來處理信號sleep(3);pcntl_signal_dispatch();

pcntl_signal_dispatch()這個函數是PHP5.3以上才支持的,如果你的PHP版本大于5.3,建議使用這個方法調用信號處理器。5.3以下的版本需要在注冊信號之前加上:declare(ticks = 1);

更多關于PHP相關內容感興趣的讀者可查看本站專題:《PHP進程與線程操作技巧總結》、《PHP網絡編程技巧總結》、《PHP基本語法入門教程》、《PHP數組(Array)操作技巧大全》、《php字符串(string)用法總結》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧匯總》

希望本文所述對大家PHP程序設計有所幫助。

標簽: PHP
相關文章:
主站蜘蛛池模板: 美国三级大片 | 国产xh98hx在线观看 | 亚洲三级毛片 | 性欧美另类老妇高清 | 欧美精品a毛片免费观看 | 狠狠综合久久久久综合 | 国产一区二区三区在线观看影院 | 久久91精品国产91久久跳舞 | 久久久久久久国产 | 久久国产精品歌舞团 | 亚洲欧美人妖另类激情综合区 | 欧美成人毛片免费网站 | 久草黄视频 | 亚洲一区二区三区免费在线观看 | 真人毛片视频 | 九九久久国产精品 | 欧美xxxx精品另类 | 三级手机在线观看 | 免费无遮挡毛片 | 精品特级一级毛片免费观看 | 亚洲视频在线一区二区 | 一级高清毛片免费a级高清毛片 | 国产一级大片 | 免费欧洲毛片a级视频 | 特黄特黄一级高清免费大片 | 女人张开腿男人捅 | 欧美国产精品 | 夜色综合 | 亚洲最大的视频网站 | 视频亚洲一区 | 日韩在线视频网址 | 亚洲国产伦理 | 久久亚洲精品中文字幕第一区 | 欧美日韩一区二区高清视 | 成人看片在线观看免费 | 欧美成在线 | 一个人看的免费高清视频日本 | 国产一级免费片 | 日本人的色道www免费一区 | 亚洲精品午夜国产va久久成人 | 亚洲高清成人欧美动作片 |