文章目錄
9. I/O複用
I/O複用:使得程序能同時監聽多個文件描述符
9.1 文件描述符(事件)就緒
- 可讀:
- socket內核接受緩衝區有數據
- 對方關閉連接
- 監聽的socket上有新的連接請求
- socket上有未處理的錯誤
- 可寫:
- socket內核發送緩衝區有數據
- socket寫操作被關閉,對寫操作關閉對socket執行寫操作,觸發SIGPIPE信號
- socket使用非阻塞connect連接成功或失敗(超時)之後
- socket上有未處理對錯誤
- 異常:
socket上接受到帶外數據(緊急數據)
9.2 ET、LT
LT
ET
9.3 select、poll、epoll區別
10. 信號
10.1 信號產生
- 用戶輸入(ctrl+c)
- 系統異常(非法訪問內存)
- 系統狀態變化(alarm定時器)
- kill命令(函數)
10.2 發送信號
int kill(pid_t pid, int sig);
若sig==0,kill函數不發送任何信號。可以用來檢測目標進程或進程組是否存在,因爲檢測工作總是在信號發送之前就執行。不過這種檢測方式不可靠,一方面由於進程pid迴繞,可能導致被檢測的pid不是我們期待的進程,另一方面,這種檢測不是原子操作。
10.3 信號默認處理方式:SIG_DFL
- 結束進程
- 忽略信號:SIG_IGN
- 結束進程並生成核心轉儲文件
- 暫停進程
- 繼續進程
10.4 標準信號
SIGHUP:控制終端掛起
SIGPIPE:往讀終端被關閉的管道或者socket連接中寫數據
SIGCHLD:子進程狀態發生變化(退出、暫停)
SIGURG:socket連接上接受到緊急數據
- 在多進程、多線程環境中,要以進程、線程爲單位來處理信號和阻塞信號集。不能設想新創建的進程、線程具有和父進程、主線程完全相同的信號特徵。如:fork調用產生的子進程將繼承父進程的阻塞信號集,但具有一個空的未決信號集。
10.5 signal、sigaction
sighandler_t signal(int signum, sighandler_t handler);
int sigaction(int signum, const struct sigaction *act,
struct sigaction *oldact);
信號掩碼指定哪些信號不能發送給本進程