UNIX环境高级编程 文件I/O
大多數文件I/O 只需要用到 5個函數 : ? ?open , read , write , lseek , close?
本章描述的都是不帶緩沖的I/O(read write 都調用內核中的一個系統調用)
?
文件描述符?
? ? ?對于內核而言,所有文件都通過文件描述符引用。
? ? ?文件描述符是一個非負整數
? ? ?打開或創建一個新文件時,內核都將返回一個文件描述符
? ? ?文件描述符的范圍是 0~OPEN_MAX-1
?
?
函數 open 和 openat
? ? ?調用 open 或 openat 可以打開或創建一個文件
? ? ?int open( const char *path , int oflag , . . . /* mode_t mode */ ?)
? ? ?int ?openat( int fd , const char *path , int oflag , . . . /* mode_t mode */
? ? ?僅當創建新文件時才使用最后的課表參數。
? ? ?oflag參數可以用來說明此函數的多個選項:
? ? ? ? ? O_RDONLY ? ?只讀打開
? ? ? ? ? O_WRONLY ? 只寫打開
? ? ? ? ? O_RDWR ? ? ? 讀寫打開
? ? ?open 和 openat 返回的文件描述符,一定是最小的未用描述符數值
? ? ?
? ?
函數 creat
? ? ?調用creat函數創建一個新文件
? ? ?int creat ( const char *path , mode_t mode)
? ? ?效果等同于 open( path , O_WRONLY | O_CREAT | O_TRUNC , mode )
? ? ?creat 以只寫方式打開所創建的文件。
函數 close
? ? ?調用此函數關閉一個打開文件。
? ? ?int close ( int fd )
?
函數 lseek
? ? ?每個打開文件都有一個 文件偏移量。 用來度量從文件開始處計算的字節數。
? ? ?讀,寫操作都從當前偏移量開始,并增加所讀寫的偏移量。
? ? ?off_t lseek ( int fd ,off_t offset , int whence) ;
? ? ?whence 參數 :
? ? ? ? ? SEEK_SET ? ? ? ? ?從文件開始處便宜offset個字節
? ? ? ? ? SEEK_CUR ? ? ? ? 從文件偏移量設置當前值加offset
? ? ? ? ? SEEK_END ? ? ? ? 將偏移量設置為文件長度加偏移量
? ? ?
? ? ?lseek調用成功后返回新的偏移量?
函數 read
? ? ?從打開的文件中讀數據
? ? ?ssize_t read( int fd, void *buf, size_t nbytes)
? ? ?
? ? ?調用成功返回讀取到的字節數,達到文件末端返回0。
? ? ?
函數 write
? ? ?向打開文件寫數據
? ? ?ssize_t write ( int fd, void *buf, size_t nbytes)
? ? ?返回值通常與 nbytes 相同。
?
文件共享
? ? ?內核使用 3 種數據結構表示打開文件:
? ? ? ? ??
? ? ? ? ? (1) 進程表項
? ? ? ? ? ? ? ? ? ? ? ? ?1.文件描述符
? ? ? ? ? ? ? ? ? ? ? ? ?2.指向文件表項的指針
? ? ? ? ? (2)文件表項
? ? ? ? ? ? ? ? ? ? ? ? ?1.文件狀態標志 ( 比如 讀,寫,非阻塞等 )
? ? ? ? ? ? ? ? ? ? ? ? ?2.當前文件偏移量
? ? ? ? ? ? ? ? ? ? ? ? ?3.指向V節點表項的指針
? ? ? ? ? (3)V節點表項
? ? ? ? ? ? ? ? ? ? ? ? ?每個打開文件都有一個V節點結構。
函數 pread 和 pwrite
? ? ?屬于原子操作。
? ? ?不更新當前文件偏移量
函數 dup 和 dup2
? ? ?復制一個現有的文件描述符
? ? ?int dup( int fd )
? ? ?int dup2( int fd , int fd2 )
? ? ?
? ? ?函數返回的新文件描述符與參數fd共享同一個文件表項
? ? ?調用 dup(fd) 等同于 fcntl ( fd , F_DUPED , 0 )
? ? ?調用 dup2(fd,fd2) 等同于 close(fd2);fcntl(fd,F_DUPED, fd2);
函數 sync , fsync 和 fdatasync
? ? ?將緩沖區的數據寫入磁盤
函數fcntl
? ? ?用來改變已打開文件的屬性
? ? ?int fcntl ( int fd , int cmd , . . . /* int arg */ ?);
? ? ?
? ? ?參數cmd :
? ? ? ? ? 復制一個已有的描述符 F_DUPFD 或 F_DUPFD_CLOEXEC
? ? ? ? ? 獲取/設置文件描述符 ? F_GETFD 或 F_SETFD
? ? ? ? ? 獲取/設置文件狀態標志 F_GETFL 或 F_SETFL
? ? ? ? ? 獲取/設置異步I/O所有權 F_GETOWN 或 F_SETOWN
? ? ? ? ? 獲取/設置記錄鎖 ? ? ? ? ? F_GETLK ? ? ? F_SETLK ? ? ? ?F_SETLKW
轉載于:https://www.cnblogs.com/wchyi/p/5547957.html
總結
以上是生活随笔為你收集整理的UNIX环境高级编程 文件I/O的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自定义控件-侧边菜单SlidingMen
- 下一篇: css选择器中间的空格