每每在select 或 epoll 中把 listen_socket 設置爲非阻塞 O_NONBLOCK
緣由是出在 accept 上, 好比有這麼一個客戶端: RST客戶端segmentfault
當這個select或epoll 的服務器很是繁忙時, 有這麼一個一鏈接就斷開的客戶端,
此時 select 返回, 但還沒執行到accept , 客戶端就斷開了, 而後執行到accept ,而後將一直阻塞
一直阻塞到有客戶鏈接爲止, 而其餘就緒的描述符將沒法工做;服務器
若是將監聽套接字設置爲O_NONBLOCK ,就算有這麼一個RST客戶端, 執行到accepte 將返回一個錯誤EAGAIN或者EWOULDBLOCK,
而不會一直阻塞在accpet調用上;socket
設置O_NONBLOCK代碼:code
int flag = fcntl(fd,F_GETFL,0); fcntl(fd,F_SETFL,flag|O_NONBLOCK);