2007年7月10日 星期二

write and SIGPIPE

這兩天把之前懷疑的東西再拿出來看看. (write and SIGPIPE)
現有的 library 都是先呼叫 select(), 確定可以讀/寫的file descriptor list, 而後逐個先執行 read, 再執行 write.

但有一個 glare condition 沒有處理到. 若是在 read() 和 write() 之間, socket 被對端關閉了, 那呼叫 write() 就會產生 SIGPIPE. 如果沒有忽略, 或者處理 SIGPIPE, 那預設的處理方式就是退出程式.

解決的方法, 就是寫一個 dummy 的 signal handler. 當 write() 觸發 SIGPIPE 後, 忽略他. 靠下一次的 read() 來關閉這個鏈路.

至於已經有的程式, 就得逐個檢查了.

沒有留言: