首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

Linux C 程式設計:非緩衝 I/O 系統呼叫筆記

     編輯:關於C

核心概念

  • 檔案描述符 (fd):非負整數,進程打開檔案表索引。0/1/2 分別為 stdin/stdout/stderr。
  • Unix 哲學:「一切皆檔案」—— 磁碟檔、Socket、管道、裝置皆用 fd 操作。
  • 非緩衝 I/O:read/write 直接進入核心,無用戶態緩衝(區別於 stdio.h 的 fread/fwrite)。

基本系統呼叫

#include <unistd.h>
#include <fcntl.h>

ssize_t read(int fd, void *buf, size_t count);   // 成功返回讀取位元組數,0=EOF,-1=錯誤
ssize_t write(int fd, const void *buf, size_t count);

實務上通常包在迴圈處理 EINTR、短讀/短寫:

ssize_t readn(int fd, void *buf, size_t n) {
    size_t left = n; char *p = buf;
    while (left > 0) {
        ssize_t r = read(fd, p, left);
        if (r < 0) { if (errno == EINTR) continue; return -1; }
        if (r == 0) break;  // EOF
        left -= r; p += r;
    }
    return n - left;
}

I/O 多工模型

待續

下篇將詳細比較 select、poll、epoll(LT/ET 模式)、邊緣觸發程式設計模式、epoll 驚群問題與解決方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
模型特點適用場景
Blocking I/O預設,read/write 阻塞至就緒簡單客戶端、低併發
Non-blocking I/Ofcntl(fd, F_SETFL, O_NONBLOCK),立即返回 EAGAIN需自行輪詢,CPU 佔用高
I/O 多工select/poll/epoll 監控多 fd,單執行緒處理高併發高併發伺服器標準選擇