php程序間通訊的另外乙個手段就是通過 訊號 來在程序間傳遞資訊。訊號是一種系統呼叫。通常我們用的kill命令就是傳送某個訊號給某個程序的。具體有哪些訊號可以在liunx/mac中執行kill -l
檢視。
一些php訊號的意思如下:
sighup
終止程序 終端線路結束通話
sigint
終止程序 中斷程序
sigquit
建立core檔案終止程序,並且生成core檔案
sigill
建立core檔案 非法指令
sigtrap
建立core檔案 跟蹤自陷
sigbus
建立core檔案 匯流排錯誤
sigsegv
建立core檔案 段非法錯誤
sigfpe
建立core檔案 浮點異常
sigiot
建立core檔案 執行i/o自陷
sigkill
終止程序 殺死程序
sigpipe
終止程序 向乙個沒有讀程序的管道寫資料
sigalarm
終止程序 計時器到時
sigterm
終止程序 軟體終止訊號
sigstop
停止程序 非終端來的停止訊號
sigtstp
停止程序 終端來的停止訊號
sigcont
忽略訊號 繼續執行乙個停止的程序
sigurg
忽略訊號 i/o緊急訊號
sigio
忽略訊號 描述符上可以進行i/o
sigchld
忽略訊號 當子程序停止或退出時通知父程序
sigttou
停止程序 後台程序寫終端
sigttin
停止程序 後台程序讀終端
sigxgpu
終止程序 cpu時限超時
sigxfsz
終止程序 檔案長度過長
sigwinch
忽略訊號 視窗大小發生變化
sigprof
終止程序 統計分布圖用計時器到時
sigusr1
終止程序 使用者定義訊號1
sigusr2
終止程序 使用者定義訊號2
sigvtalrm
終止程序 虛擬計時器到時
下面來看乙個例子。啟動3個子程序,執行,父程序等待5秒鐘,向子程序傳送sigint訊號。子程序捕獲訊號,呼叫訊號處理函式處理。
<?php
$parentpid = posix_getpid();
echo "parent progress pid:\n";
// 定義乙個訊號處理函式
function sighandler($signo) progress,oh no ,i'm killed!\n");
}}//php < 5.3 使用
//配合pcntl_signal使用,表示每執行一條低階指令,就檢查一次訊號,如果檢測到註冊的訊號,就呼叫其訊號處理器。
//declare(ticks=1);
pcntl_signal( sigint, 'sighandler'); //註冊訊號處理函式
$childlist = ;
for( $i = 0; $i < 3; $i++ )
}else if( $pid == -1 )else
}sleep(5);
foreach( $childlist as $key=>$vo )
sleep(2);
echo "($parentpid)parent is end " . php_eol;
pcntl_signal_dispatch ( void )
呼叫每個等待訊號通過pcntl_signal() 安裝的處理器。說明一下:pcntl_signal()函式僅僅是註冊訊號和它的處理方法,真正接收到訊號並呼叫其處理方法的是pcntl_signal_dispatch()函式必須在迴圈裡呼叫,為了檢測是否有新的訊號等待dispatching。
pcntl_signal_dispatch()這個函式是php5.3以上才支援的,如果你的php版本大於5.3,建議使用這個方法呼叫訊號處理器。5.3以下的版本需要在註冊訊號之前加一句:declare(ticks = 1);表示每執行一條低階指令,就檢查一次訊號,如果檢測到註冊的訊號,就呼叫其訊號處理器。
程序間通訊 訊號
關於訊號在程序間的通訊,這是乙個比較複雜的東西,本人不在這裡做過多的介紹.如果想系統的學習,請參考 unix環境高階程式設計這本書 我在這裡只展示幾個例子 用守護程序實現檔案的同步.由子程序1改乙個檔案,守護程序2,檢查到檔案已經改變,並通過訊號告訴給父程序,父程序實現輸出.程式有點複雜,但思路還是...
程序間通訊(訊號)
linux系統程序間通訊有很多種方式 較多使用的有訊號,管道以及system vipc。各種通訊方式各有優缺點。這部分主要就程序間通訊方式進行總結。1 訊號。訊號進行程序間通訊方式有一點需要明確 訊號只能通知,不能在程序間共享資料資源。也就是說訊號僅僅是告訴你一下某個事情發生了。而我們的程式則可以對...
程序間通訊 訊號
訊號 概念 訊號是在軟體層次上對中斷機制的一種模擬,它是比較複雜的通訊方式,用於通知程序有某事件發生,乙個程序收到乙個訊號與處理器收到乙個中斷請求效果上可以說是一致的。程序在接收到這個訊號以後,可以設定響應的處理動作 忽略或者呼叫函式進行處理。在linux下命令列 kill l 可以檢視linux下...