- 標準文件描述符定義在<unistd.h>中,STDIN_FILENO,? STDOUT_FILENO,? STDERR_FILENO
- 打開一個文件:open()
? ? ? #include<sys/stat.h>
? ? ? #include<fcntl.h>
? ? ? int open(const char *pathname, int flags, …/* mode_t mode*/);
? ? ? (1)調用發生錯誤,open返回-1,并將errno設置為相應的錯誤標志。
? ? ? (2)flags為位掩碼,用于指定文件的訪問模式,O_CREATE ,O_RDONLY, O_WRONLY,? O_RDWR,O_APPEND; ? 注:因是位掩碼,O_RDWR不等同于O_RDONLY|O_WRONLY
? ? ? (3)mode為位掩碼,用于指定文件的訪問權限。如果open? flags參數并沒有指定O_CREATE標志,則可以省略mode參數。
- O_EXCL,此標志與O_CREATE標志結合使用表明如果文件已經存在,則不會打開文件,且open()調用失敗,返回錯誤,errno為EEXIST。換言之,此標志確保了調用者(open()的調用進程)就是創建文件的進程。
- 讀取文件內容:read()
? ? ? #include<unistd.h>
? ? ? ssize_t read(int fd, void * buffer, size_t count);
? ? ? (1)如果read()調用成功,將返回實際讀取的字節數,如遇到文件結束(EOF)則返回0
? ? ? (2)從終端讀取字符,一遇到換行符(\n),read()調用就會結束。
- 數據寫入文件:write()
? ? ? #include<unistd.h>
? ? ? ssize_t write(int fd, void * buffer, size_t count);
? ? ? write()調用成功,將返回實際寫入文件的字節數
- 關閉文件:close()
? ? ? #include<unistd.h>
? ? ? int close(int fd);
?? ? close()可能執行失敗:企圖關閉一個未打開的文件描述符;或者兩次關閉同一個文件描述符。
- size_t: 無符號整數類型;? ? ? ? ? ssize_t:有符號的整數類型;?
- 改變文件偏移量:lseek()
? ? ? #include<unistd.h>
? ? ? off_t lseek(int fd, off_t offset, int whence);
?? ? (1)文件第一個字節的偏移量為0
?? ? (2)offset:指定一個以字節為單位的數值, off_t:有符號整形數
?? ? (3)whence:表明應參照哪個基點來解釋offset參數。
? ? ? ? ? ? SEEK_SET: 將文件偏移量設置為從文件頭部起始點開始的offset個字節
? ? ? ? ? ? SEEK_CUR: 相對于當前文件偏移量,將文件偏移量調整offset個字節
? ? ? ? ? ? SEEK_END: 將文件偏移量設置為起始于文件尾部的offset個字節,也就是說,offset參數應該從文件最后一個字節之后的下一個字節算起
?? ? (4)lseek()調用成功會返回新的文件偏移量。
?? ? (5)lseek()并不適用于所有類型的文件。不允許將lseek()應用于管道、FIFO、socket或者終端,一旦如此,errno返回ESPIPE
- 通用I/O模型以外的操作:ioctl()
? ? ? #include<sys/ioctl.h>
? ? ? int ioctl(int fd, int request, …/*argp*/);
? ? ? (1) request: 指定了將在fd上執行的控制操作。具體設備的頭文件定義了可傳遞給request參數的常量。
? ? (2)ioctl根據request的參數值來確定argp所期望的類型。通常情況下,argp是指向整數或結構的指針。有些情況,不需要使用argp
? ? (3)ioctl在5350上用于對于芯片的管腳進行I/O設置。常規使用場景是open-->ioctl-->close