高级编程学习笔记day01(知识点篇)
文件IO學習筆記
1. 文件描述符:所有打開的文件都通過文件描述符引用.
?? ?文件描述符0與進程的標準輸入關聯
?? ?文件描述符1與進程的標準輸出關聯
?? ?文件描述符2與進程的標準錯誤關聯
2. 函數open
?? ?int open(const char *pathname, int flags);
?? ?int open(const char *pathname, int flags, node_t mode);
?? ?node: (1) flags參數用一個或者多個常量進行或運算.
?? ??? ?? (2) O_RDONLY 只讀打開, O_WRONLY 只寫打開, O_RDWR 讀,寫打開, O_EXEC 只執行打開, O_SEARCH 只搜索打開(應用于目錄), 這五個參數必須且只選擇一個.
?? ??? ?????? O_APPEND 追加, O_CREAT 創建等是可選項.
3. 函數close
?? ?int close(int fd);
4. 函數lseek
?? ?off_t lseek(int fd, off_t offset, int whence);
?? ?note: (1) 如果成功返回新的文件偏移量,若失敗返回-1
?? ??? ?? (2) 當打開一個文件時,除非指定O_APPEND選項,否則偏移量被設置為0.
?? ??? ?? (3) 若whence是SEEK_SET, 則將該文件的偏移量設置為距文件開始offset個字節.
?? ??? ?????? 若whence是SEEK_CUR, 則將該文件的偏移量設置為當前值加offset, offset可為正或負.
?? ??? ??? ?? 若whence是SEEK_END, 則將該文件的偏移量設置為文件長度加offset, offset可正可負.
5. 函數read
?? ?ssize_t read(int fd, void *buf, size_t count);
?? ?note: (1) 成功返回讀到的字節數, 若以到文件尾返回0, 出錯返回-1.
?? ??? ?? (2) 多種情況下可導致實際讀到的字節數少于要求讀的字節數.例..要求讀100字節,但到文件尾端只有30個字節,則返回30.
6. 函數write
?? ?ssize_t write(int fd, void *buf, size_t count);
?? ?note: (1) 成功返回寫入的字節數,失敗返回-1.
7. 文件共享
?? ?(1) 內核使用三種數據結構表示打開文件: 進程表項, 文件表項, v結點表項
?? ?(2) 每個進程在進程表中都有一個記錄項, 記錄項包含一張打開的文件描述符, 與每個文件描述符相關聯的是文件描述符標志, 和指向一個文件表項的指針.
?? ?(3) 內核為所有打開的文件維持一張文件夾, 每個文件表項包含文件狀態標志, 當前文件偏移量和指向該文件v結點表項的指針.
?? ?(4) 每個打開文件(或設備)都有一個v結點結構, 包含文件類型和對此文件進行各種操作函數的指針.
8. 原子操作
?? ?note: (1) 原子操作指的是由多步操作組成的一個操作.要么執行完所有的操作步驟, 要么一步也不執行.
?? ??? ?? (2) 追加到一個文件的原子操作:打開文件時設置O_APPEND標志.
?? ??? ?? ?
9. 函數dup(), dup2()
?? ?int dup(int fd);
?? ?int dup2(int fd, int fd2);
?? ?note: (1) 成功返回新的文件描述符, 失敗返回-1.
?? ??? ?? (2) dup返回的新的文件描述符一定是當前可用文件描述符的最小數值.
?? ??? ?? (3) dup2函數可以用fd2參數指定新描述符的值. 如果fd2已經打開, 則先將其關閉. 如果fd等于fd2, 則dup2返回fd2, 而不關閉它. 否則, fd2的FD_CLOEXEC文件描述符標志就被清除, 這樣fd2在進程調用exec時打開狀態.
10. 函數fcntl
?? ?int fcntl(int fd, int cmd,.../* int arg */);
?? ?note: (1) 復制一個已有的文件描述符(cmd = F_DUPFD, 或F_DUPFD_CLOEXEC)
?? ??? ?? (2) 獲取/設置文件描述符標志(cmd = F_GETFD or cmd = F_SETFD).
?? ??? ?? (3) 獲取/設置文件狀態標志(cmd = F_GETFL or cmd = F_SETFL).
?? ??? ?? (4) 獲取/設置異步I/O所有權(cmd = F_GETOWN or cmd = F_SETOWN).
?? ??? ?? (5) 獲取/設置記錄鎖(cmd = F_GETLK, F_SETLK or cmd = F_SETLKW).
轉載于:https://www.cnblogs.com/frank-zhao19/p/10550160.html
總結
以上是生活随笔為你收集整理的高级编程学习笔记day01(知识点篇)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android Jetpack Navi
- 下一篇: c语言编写程序数一下 1到100的所有整