今兒出了這么一事,由于做daemon進程時候stdin stout sterr沒有重定向到/dev/null,當終端關閉后,句柄找不到對應的終端,導致程序崩潰了。
分析原因到原因后,用python測試了一下,發(fā)現(xiàn)如果用print每次輸出的字符串小于1024,程序在標準IO無法正常得情況下不影響程序,但是一單超過1024或者一單有‘\n’ 就會觸發(fā) linux 的io error 5。
再次使用sys.stdout.write('xxx')函數(shù)進行測試,發(fā)現(xiàn)并不是每次輸出小于1024就可以過,而是無論每次輸出多少字符,累計一旦達到1024個字符 準確的說是最后一次write()的字符加上之前write綜合大于1024就會觸發(fā)io error 5。
根據(jù)以上的現(xiàn)象大膽猜測可能是存在一個默認1024的buff,查資料得知,IO有兩種一種是unix io 就是咱們平時用的open write read close等方法,是unbuffer的IO,另外一種是與stream結合的標準IO也叫做buffer io,buffer分三種,分別是line buff、full buff、no buff , stderr默認是no buff,stdin跟stdout默認是line buff,這就解釋了之前實驗的現(xiàn)象 ,但是linux內(nèi)核fd結構體里并沒有buffer這么個屬性,但是linux內(nèi)核stream結構體標準IO的write,read等對stream的操作都是有buffer設定的,改變標準IO的buff size也可以通過linux內(nèi)核自帶的函數(shù)setvbuf()或者setbuf()來實現(xiàn)對stream結構體的buffer大小的改變。
回到python里 ,python打開標準IO用fdopen,以下是測試的python代碼,用了這個代碼,buffer從1024變成了512.
import Daemon
import time
import os
import sys
Daemon.Start() #變成守護進程
time.sleep(10)
fd=open("out.txt",'a')
fail=False
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 512) #設定為512B的buffer
for i in xrange(2048):
if not fail:
try:
sys.stdout.write('a'i)
out=str('a'i)
except Exception,err:
out=str(err)
fail=True
fd.write(out)
else:
break
linux的標準IO的buffer
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
相關閱讀更多精彩內(nèi)容
- 轉自:http://blog.csdn.net/wuxiushu/article/details/52358172...
- 從今天開始我們來聊聊Netty的那些事兒,我們都知道Netty是一個高性能異步事件驅動的網(wǎng)絡框架。 它的設計異常優(yōu)...