Linux高性能服務器編程(四)

9. I/O複用

I/O複用:使得程序能同時監聽多個文件描述符

9.1 文件描述符(事件)就緒

  • 可讀:
  1. socket內核接受緩衝區有數據
  2. 對方關閉連接
  3. 監聽的socket上有新的連接請求
  4. socket上有未處理的錯誤
  • 可寫:
  1. socket內核發送緩衝區有數據
  2. socket寫操作被關閉,對寫操作關閉對socket執行寫操作,觸發SIGPIPE信號
  3. socket使用非阻塞connect連接成功或失敗(超時)之後
  4. 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);

在這裏插入圖片描述

信號掩碼指定哪些信號不能發送給本進程

10.6 統一事件源

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章