php訊號處理

2021-09-08 20:07:32 字數 1186 閱讀 3022

pcntl pcntl_signal

訊號註冊函式

pcntl_alarm 指定秒數中斷程式執行任務。 每次執行只會有乙個定時器生效,若之前計時器還沒結束就定義新定時器,會替代之前定時器並返回之前定時器結束前秒數,若之前計時器已完成返回0 引數設為0,會清空當前所有定時器,並不發起呼叫 定時器會中斷系統,即便是sleep執行中 pcntl_fork

建立子程序

unix建立程序效率要比執行緒高,但需考慮程序數和記憶體等限制 <?php $pid = pcntl_fork(); switch($pid) ?> pcntl_waitpid

等待或返回fork的子程序狀態

掛起當前程序的執行直到引數pid指定的程序號的程序退出, 或接收到乙個訊號要求中斷當前程序或呼叫乙個訊號處理函式。

如果pid指定的子程序在此函式呼叫時已經退出(俗稱殭屍程序),此函式 將立刻返回。

pid可選值

小於-1 等待任意程序組id等於引數pid給定值的絕對值的程序。 -1 等待任意子程序;與pcntl_wait函式行為一致。 0 等待任意與呼叫程序組id相同的子程序。 大於0 等待程序號等於引數pid值的子程序。 options wnohang 如果沒有子程序退出立刻返回。 wuntraced 子程序已經退出並且其狀態未報告時返回。

其他方式去計算本函式的返回值

pcntl_wexitstatus

檢查狀態**是否代表乙個正常的退出。

程序共享內容 <?php for ($i = 1; $i <= 5; ++$i) } while (pcntl_waitpid(0, $status) != -1) ?> sigchld: 父程序不阻塞

sigchld訊號會在 乙個或多個 子程序結束時向父程序通知

此時再加上pcntl_waitpid loop來讓父程序及時**全部結束的子程序

<?php declare(ticks = 1); pcntl_signal(sigchld, "signal_handler"); function signal_handler($signal) exit; } } for ($i = 1; $i <= 5; ++$i) } while(1) ?> pcntl_exec

呼叫程式執行,並取代自身

<?php print "before\n"; pcntl_exec("/usr/bin/uptime"); //下邊不會輸出 print "after\n"; ?>

訊號處理,訊號佇列

最近幾天在看訊號,對實時訊號的實時性不是很理解,今天看了下 dequeue signal 差不多理解了,乙個實時訊號可以有多個實時佇列,在signal集合裡乙個signal可能有多個signal佇列。訊號,有訊號佇列,有訊號集 sigpending是訊號pending的結構體,裡面有sigqueue...

Linux程序訊號 訊號處理

一 訊號相關概念 1.實際執行訊號的處理動作稱為訊號遞達 delivery 2.訊號從產生到遞達之間的狀態稱為訊號未決 pending 不一定會立即delivery 3.程序可以選擇阻塞 block 某個訊號。不會遞達 4.被阻塞的訊號產生時將保持在未決狀態,知道程序解除對此訊號 的阻塞,才會執行遞...

訊號 訊號處理函式(捕捉)

要明白訊號處理函式的使用,就要先知道訊號的捕捉設定,什麼時候會呼叫訊號處理函式和其執行的流程是什麼,下圖完整的展示了訊號捕捉的設定,以及訊號處理函式的觸發機制 所以,從上圖可以知道,只有當程式中斷,異常或系統呼叫,才會進入核心態,也只有進入了核心態才能處理訊號,在這裡初學者常常有乙個誤區,他們會覺得...