国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

記錄php daemon 進程 遇到的問題--posix_setsid函數

浠ラ箍 / 1865人閱讀

摘要:則發現程序并不會完整輸出行數據,只是部分數據。如不關閉,將會浪費系統資源,這倒是小事,造成進程所在的文件系統無法卸下以及引起無法預料的錯誤。所以需要關閉這些關閉標準輸入輸出與錯誤顯示。

總結一下先~

一個守護進程一般需要root權限,因為可能要使用特殊端口1-1024及其他權限

一個守護進程的父進程會被fork之后被殺掉,所以可以說他的父進程是init進程。

一個守護進程無需交互,也和終端(teriminalsession)無關,所以任何輸出,無論是向標準輸出還是錯誤輸出,都需要特殊處理,涉及到的就是stdout和stderr

上代碼

下面是我用php 編寫一個守護進程 demo


好下面我們執行操作,輸出如下

root@tb:/home/tb/linuxing# php php_daemon.php 
fork succ
loop0
root@tb:/home/tb/linuxing# loop1
loop2
loop3
loop4
...
loop20

查看demo.txt

cat demo.txt 
0--2016-07-15 17:49:47
1--2016-07-15 17:49:48
2--2016-07-15 17:49:49
...
問題來了

貌似沒有問題,但是用以上php代碼,執行后,馬上關閉當前終端。則發現程序并不會完整輸出20行數據,只是部分數據。
問題復現步驟:
1.ubuntu終端Azhong 執行 php php_daemon.php
2.關閉終端A
3.打開新終端B,ps -aux |grep php 發現無此進程

如果手慢,自己把握時間或者調整for 次數。。

為什么呢

進程從創建它的父進程那里繼承了打開的文件描述符。如不關閉,將會浪費系統資源,(這倒是小事),造成進程所在的文件系統無法卸下以及引起無法預料的錯誤。
所以需要關閉這些

    fclose(STDIN),fclose(STDOUT),fclose(STDERR)

關閉標準輸入輸出與錯誤顯示。

正確代碼之一

再解釋一下

如果想在關閉當前終端后繼續執行
需要關閉echo 那一行,因為當然echo 和當然session關聯,sesssion關閉后,echo就會導致php致命錯誤,所以下面的file_put_contents不會執行。

所以為了避免除顯示輸出的echo導致php錯誤的問題,我們一般建議這樣

      global $STDOUT, $STDERR;
      fclose(STDOUT);
      fclose(STDERR);
      $STDOUT = fopen("/dev/null", "rw+");
      $STDERR = fopen("/dev/null", "rw+");
      

加上上面那句,所有的顯示的不顯示的echo err之類都可以被忽略。也就是說你把
echo "loop" . $i . "n";這句加上也沒有問題
指到dev/null,,如果你不這樣,你的stdout會跟你的session有關。。
你的session一關,你的stdout就失效,,echo就報錯了。

更優處理辦法

感謝

三金 CFC4N

守護進程詳解及創建,daemon()使用

不懂的太多

當然這只是個例子,實際中還需要考慮目錄權限,umask,figchld信號。這些我還沒接觸。。。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21776.html

相關文章

  • PHP進程初探 --- 再次談daemon進程

    摘要:因為子進程一定不會是組長進程,所以子進程可以調用。主進程退出子進程繼續執行啦啦啦,啦啦啦,啦啦啦,已經變成啦,開心一般服務器軟件都有寫配置項,比如以模式運行還是以模式運行。 [原文地址:https://blog.ti-node.com/blog...] 其實前面是談過一次daemon進程的,但是并涉及過多原理,但是并不影響使用。今天打算說說關于daemon進程更多的二三事,本質上說,如...

    fox_soyoung 評論0 收藏0
  • 守護進程

    摘要:守護進程為什么需要守護進程呢普通進程在運行時可以被控制終端發出的信號打斷而守護進程由于脫離了控制終端所以不會被其打斷守護進程創建的標準流程調用設置文件創建的掩碼子進程并關閉父進程調用創建新會話把當前工作目錄切換為根目錄不需要的文件描述符全部 守護進程 為什么需要守護進程呢? 普通進程在運行時可以被控制終端發出的信號打斷, 而守護進程由于脫離了控制終端, 所以不會被其打斷. 守護進程創建...

    Carbs 評論0 收藏0
  • PHP進程系列筆記(四)

    摘要:本節主要講解常用函數和進程池的概念,也會涉及到守護進程的知識。所以任何時候,建議預先創建好進程,也就是使用進程池的方式實現。 本節主要講解Posix常用函數和進程池的概念,也會涉及到守護進程的知識。本節難度較低。 Posix常用函數 posix_kill 向指定pid進程發送信號。成功時返回 TRUE , 或者在失敗時返回 FALSE 。 bool posix_kill ( int $...

    Cc_2011 評論0 收藏0
  • workerman 簡要分析

    摘要:后面每開啟一個子進程,會將子進程的存儲到中,用來后面主進程監控子進程,如果子進程意外終止,主進程可以重新佛。將當前子進程設置為會話組再次創建子進程,為了防止在的系統下重新打開控制終端。 wokerman 啟動分析 @(學習)[workerman, php] 前期想說的 也是最近才看的代碼,遇到不懂得地方就去google,所以這篇文章里面穿插了很多參考資料,可以直接點擊閱覽。 需要了解一...

    senntyou 評論0 收藏0
  • workerman筆記-php創建守護進程

    摘要:守護進程常常在系統引導裝入時啟動,在系統關閉時終止。進程組有進程組來唯一標識。且該進程組不會因組長進程的退出而受到影響。 使用函數 pcntl_fork();//創建子進程 posix_setsid();//設置當前進程為進程組長 posix_getpid();//獲取進程id 例子 workerman中將進程 /** * Run as deamon mode. * * @th...

    Cristic 評論0 收藏0

發表評論

0條評論

浠ラ箍

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<