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;
}
| 模型 | 特點 | 適用場景 |
|---|---|---|
| Blocking I/O | 預設,read/write 阻塞至就緒 | 簡單客戶端、低併發 |
| Non-blocking I/O | fcntl(fd, F_SETFL, O_NONBLOCK),立即返回 EAGAIN | 需自行輪詢,CPU 佔用高 |
| I/O 多工 | select/poll/epoll 監控多 fd,單執行緒處理高併發 | 高併發伺服器標準選擇 |