經常使用的PCNTL函數
1. pcntl_alarm ( int $seconds )
設置一個$seconds秒後發送SIGALRM信號的計數器
2. pcntl_signal ( int $signo , callback $handler [, bool $restart_syscalls ] )
爲$signo設置一個處理該信號的回調函數。下面是一個隔5秒發送一個SIGALRM信號,並由signal_handler函數獲取,而後打印一個「Caught SIGALRM」的例子:
3. pcntl_exec ( string $path [, array $args [, array $envs ]] )
在當前的進程空間中執行指定程序,相似於c中的exec族函數。所謂當前空間,即載入指定程序的代碼覆蓋掉當前進程的空間,執行完該程序進程即結束。
4. pcntl_fork ( void )
爲當前進程建立一個子進程,而且先運行父進程,返回的是子進程的PID,確定大於零。在父進程的代碼中能夠用 pcntl_wait(&$status)暫停父進程知道他的子進程有返回值。注意:父進程的阻塞同時會阻塞子進程。可是父進程的結束不影響子進 程的運行。
父進程運行完了會接着運行子進程,這時子進程會從執行pcntl_fork()的那條語句開始執行(包括此函數),可是此時它返回的是零(表明這是一個子 進程)。在子進程的代碼塊中最好有exit語句,即執行完子進程後當即就結束。不然它會又重頭開始執行這個腳本的某些部分。
注意兩點:
1. 子進程最好有一個exit;語句,防止沒必要要的出錯;
2. pcntl_fork間最好不要有其它語句,例如:
5. pcntl_wait ( int &$status [, int $options ] )
阻塞當前進程,只到當前進程的一個子進程退出或者收到一個結束當前進程的信號。使用$status返回子進程的狀態碼,並能夠指定第二個參數來講明是否以阻塞狀態調用:
1. 阻塞方式調用的,函數返回值爲子進程的pid,若是沒有子進程返回值爲-1;
2. 非阻塞方式調用,函數還能夠在有子進程在運行但沒有結束的子進程時返回0。
6. pcntl_waitpid ( int $pid , int &$status [, int $options ] )
功能同pcntl_wait,區別爲waitpid爲等待指定pid的子進程。當pid爲-1時pcntl_waitpid與pcntl_wait 同樣。在pcntl_wait和pcntl_waitpid兩個函數中的$status中存了子進程的狀態信息,這個參數能夠用於 pcntl_wifexited、pcntl_wifstopped、pcntl_wifsignaled、pcntl_wexitstatus、 pcntl_wtermsig、pcntl_wstopsig、pcntl_waitpid這些函數。
子進程在輸出child process等字樣以後sleep了2秒才結束,而父進程阻塞着直到子進程退出以後才繼續運行。
7. pcntl_getpriority ([ int $pid [, int $process_identifier ]] )
取得進程的優先級,即nice值,默認爲0,在個人測試環境的linux中(CentOS release 5.2 (Final)),優先級爲-20到19,-20爲優先級最高,19爲最低。(手冊中爲-20到20)。
8. pcntl_setpriority ( int $priority [, int $pid [, int $process_identifier ]] )
設置進程的優先級。
9. posix_kill
能夠給進程發送信號
一個進程在調用exit命令結束本身的生命的時候,其實它並無真正的被銷燬,而是留下一個稱爲殭屍進程(Zombie)的數據結構(系統調用exit, 它的做用是使進程退出,但也僅僅限於將一個正常的進程變成一個殭屍進程,並不能將其徹底銷燬)。在Linux進程的狀態中,殭屍進程是很是特殊的一種,它 已經放棄了幾乎全部內存空間,沒有任何可執行代碼,也不能被調度,僅僅在進程列表中保留一個位置,記載該進程的退出狀態等信息供其餘進程收集,除此以外, 殭屍進程再也不佔有任何內存空間。它須要它的父進程來爲它收屍,若是他的父進程沒安裝SIGCHLD信號處理函數調用wait或waitpid()等待子進 程結束,又沒有顯式忽略該信號,那麼它就一直保持殭屍狀態,若是這時父進程結束了,那麼init進程自動會接手這個子進程,爲它收屍,它仍是能被清除的。 可是若是若是父進程是一個循環,不會結束,那麼子進程就會一直保持殭屍狀態,這就是爲何系統中有時會有不少的殭屍進程。 任何一個子進程(init除外)在exit()以後,並不是立刻就消失掉,而是留下一個稱爲殭屍進程(Zombie)的數據結構,等待父進程處理。這是每一個 子進程在結束時都要通過的階段。若是子進程在exit()以後,父進程沒有來得及處理,這時用ps命令就能看到子進程的狀態是」Z」。若是父進程能及時 處理,可能用ps命令就來不及看到子進程的殭屍狀態,但這並不等於子進程不通過殭屍狀態。