MySQL 源碼中文件操作存在兩套並行實現:
open/close/read/write/seek 等,Unix/Linux 原生CreateFile/CloseHandle/ReadFile/WriteFile/SetFilePointer 等,Windows 原生雙方均可創建文本/二進制文件,功能對等:
| 操作 | 標準 C / POSIX | Win32 API |
|---|---|---|
| 打開/創建 | open() | CreateFile() |
| 讀取 | read() | ReadFile() |
| 寫入 | write() | WriteFile() |
| 定位 | lseek() | SetFilePointer() |
| 關閉 | close() | CloseHandle() |
CreateFile 不僅打開文件,還能打開通信設備、命名管道、郵件槽、磁盤、控制台等內核對象。參數豐富:
HANDLE CreateFile(
LPCTSTR lpFileName, // 文件/設備路徑
DWORD dwDesiredAccess, // 訪問模式 (GENERIC_READ/WRITE)
DWORD dwShareMode, // 共享模式 (FILE_SHARE_READ/WRITE/DELETE)
LPSECURITY_ATTRIBUTES lpSA, // 安全屬性,通常 NULL
DWORD dwCreationDisposition, // 創建方式 (CREATE_NEW/ALWAYS/OPEN_EXISTING...)
DWORD dwFlagsAndAttributes, // 標志屬性 (FILE_FLAG_OVERLAPPED 等)
HANDLE hTemplateFile // 模板文件句柄,通常 NULL
);
返回 INVALID_HANDLE_VALUE 表示失敗。
ReadFile/WriteFile 直到完成才返回,線程阻塞。CreateFile 指定 FILE_FLAG_OVERLAPPED,後續 ReadFile/WriteFile 立即返回,I/O 在後台完成,線程可執行其他任務,大幅提升併發吞吐。完成通知機制:事件對象、完成例程、I/O 完成端口 (IOCP)—— Windows 高性能服務器架構基石。
my_read/my_write/my_seek),編譯時鏈接平台特定實現。io_uring (5.1+) 或 epoll + libaio。mysys/ 目錄實現(my_open/my_read/my_write/my_seek/my_close)。