作者TKyo (暗黑貴公子)
看板PttCurrent
標題Re: [請益] 連線異常中斷後的處理
時間Mon Dec 19 06:48:03 2005
※ 引述《CCHptt (CCH)》之銘言:
: 如果一個使用者的 連線逾時 或 使用者直接將BBS瀏覽程式關閉, 在BBS伺服器中提供該
: 使用者服務的 process 是如何結束的? 是收到 termination signal 嗎?
連線逾時 :
PTT 我看不出來, 因為也沒有 "永久掛站" 的權限 @@
而 Maple 則是直接呼叫 abort_bbs()
而使用者直接將BBS瀏覽程式關閉則是送出 SIGTERM 給系統
如果是使用者直接關機的話, 則不會送出 SIGTERM 給系統
: 如果答案是 "是" 的話, 我可以先保存原來的 signal handler, 註冊自己的 signal
: handler, 處理完之後再恢復原來的 signal handler, 最後再送 SIG_TERM 給自己嗎?
SIG_TERM (Terminate): 是程式中斷時發送給系統的訊號, 而非系統發出的訊號
而 PTT 系統則是偵測 SIGHUP/SIGTERM/SIGPIPE 三種訊號時, 會呼叫 abort_bbs()
SIGHUP (Hangup):
terminal hangup detect or death of controlling process
ex. kill -HUP pid
不過現在的 deamon 都慣用 SIGHUP(1) 來告訴自己重新 reload 設定
SIGPIPE (Pipe):
當程式寫入 no reader 的 socket 或 fifo, 此動作則會產生 SIGPIPE訊號
(常見錯誤訊息為 Broken pipe)
※ 引述《in2 (敬請期待 :P)》之銘言:
: 我以為應該是 read(socket) 的時候拿到 -1 @_@
-1 應該是 select 逾時的情況, 何時逾時則是端看 vio_to 設定 (io.c:add_io())
且 (errno != EINTR) 的條件同時成立時, 才會 abort_bbs()
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.67.4.232
推 uiLtreblA:應該是 abort_bbs() 12/19 16:36
推 VictorHsieh:ptt 連線逾時是用外部程式做的 (kill SIGTERM) 12/20 00:02
→ TKyo:對, 是 abort_bbs, 很順地一連串 cp 下來 @@ 12/20 02:29
※ 編輯: TKyo 來自: 61.67.4.232 (12/20 02:30)