歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux的文件I/O編程

#include <fcntl.h> int open(const char *pathname, int oflag) oflag: 以下三個標志必須指定一個且只能指定一個
  • O_RDONLY : 只讀打開
  • O_WRONLY : 只寫打開
  • O_RDWR : 讀寫打開
以下標志可選,用與運算符(|)和其他標志結合
  • O_APPEND:每次寫的數據都添加到文件尾
  • O_TRUNC:若此文件存在,並以讀寫或只寫打開,則文件長度為0
  • O_CREAT:若文件不存在,則創建該文件。此時,open函數需要第三個參數,用於指定該文件的訪問權限位(後面描述)
  • O_EXCL:若同時指定了O_CREAT標志,而文件已經存在,則會出錯。可用於測試文件是否存在
成功時返回文件描述符,失敗返回-1。 int creat(const char *pathname, mode_t mode) mode與open的oflag相同,返回只寫打開的文件描述符。若文件存在,調用creat會清空文件。 可以用open實現creat。 off_t lseek(int filedes, off_t offset, int whence) filedes為文件描述符,offset為相對偏移量,whence可取SEEK_SET、SEEK_CUR、SEEK_END三值之一。 成功則返回現在的偏移量,失敗返回-1。 lseek的偏移量若超過文件長度,則會加長文件,並在中間形成空洞。讀空洞部分結果均為0。 ssize_t read(int filedes, void *buff, size_t nbytes) ssize_t write(int filedes, void *buff, size_t nbytes) buff指向緩沖區,nbytes指定讀出/寫入的字節數。 返回實際讀出/寫入的字節數,讀到文件末尾則返回0,寫入失敗返回-1。 由於Linux的預讀機制,buff大小一般最好取4096。 int close(int filedes) 關閉文件,成功返回0,失敗返回-1。 int dup(int filedes) int dup2(int filedes, int filedes2) 復制文件描述符,返回新的描述符。 dup返回的總是當前可用描述符中的最小值,而dup2可以指定新的描述符。若filedes2已經打開,則dup2會將其先關閉,除非filedes2==filedes。 void sync(void) 將緩沖區中修改過的數據排入寫隊列,然後返回,不等待寫入完成。 int fsync(int filedes) 對指定文件起作用,且等待寫入完成。 寫入失敗返回-1,成功返回0。 int fdatasync(int filedes) 與fsync類似,但不更新文件屬性,僅修改數據部分。 int fcntl(int filedes, int cmd, ...) cmd取值:
  • F_DUPFD:類似dup2函數,復制filedes到大於等於第三參數的最小可用描述符並返回該描述符。它不是原子操作,可能被打斷。
  • F_GETFD:返回filedes對應的文件描述符標志(FD_CLOEXEC)。
  • F_SETFD:按照第三個參數設置filedes對應的文件描述符標志。
  • F_GETFL:返回filedes對應的文件狀態標志(O_RDONLY、O_WRONLY、O_RDWR、O_APPEND、O_NONBLOCK、O_SYNC、OASYNC)
  • F_SETFL:將第三個參數設置為文件狀態標志,不能改變前三項(只讀、只寫、讀寫)。
  • F_GETOWN:獲取當前接收SIGIO和SIGURG信號的進程ID或進程組ID。
  • F_SETOWN:將第三個參數設置為接受SIGIO和SIGURG信號的進程ID或進程組ID。若第三個參數大於0,表示進程ID;小於0則其絕對值表示一個進程組ID。
int stat(const char* restrict pathname, struct stat* restrict buf) int fstat(int filedes, struct stat* buf) int lstat(const char* restrict pathname, struct stat* restrict buf) 將文件屬性傳入buf,restrict關鍵字表明該指針是訪問一個數據對象的唯一且初始的方式。 struct stat {
ino_t st_ino; /* inode number*/
mode_t st_mode; /* file type & mode */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
off_t st_size; /* total size, in bytes */
unsigned long st_blksize; /* blocksize */
unsigned long st_blocks; /* number of blocks allocated
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of inode last change
}; 使用如下的宏判斷文件類型
普通文件 S_ISREG() 目錄文件 S_ISDIR() 字符特殊文件 S_ISCHR() 塊特殊文件 S_ISBLK() FIFO文件 S_ISFIFO() 套接口文件 S_ISSOCK() 符號連接 S_ISLINK()

int utime(const char* pathname, const struct utimbuf *times)

修改文件的訪問時間和修改時間。 struct utimbuf {
time_t actime; //訪問時間
time_t modtime; //修改時間 };   int access(const char* pathname, int mode) 測試文件許可權限。成功返回0,失敗返回-1。 mode取值:
  • R_OK 測試讀許可權
  • W_OK 測試寫許可權
  • X_OK 測試執行許可權
  • F_OK 測試文件是否存在
成功返回0,失敗返回-1。 mode_t umask(mode_t cmask) 創建屏蔽字,參與指定文件的訪問權限。 cmask取0即由open和creat指定權限,取(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)即禁止所有組和其他用戶的訪問權限。 int chmod(const char* pathname, mode_t mode) int fchmod(int filedes, mode_t mode) 修改文件存取權限。 mode取值: int chown(constchar* pathname, uid_t owner, gid_t group) 修改文件的用戶ID和組ID。 int truncate(const char* pathname, off_t length) int ftruncate(int fd, off_t length) 修改文件長度。 若length小於文件長度,則超出部分消失;若length大於文件長度,則中間形成空洞,讀取空洞總是得到0。
Copyright © Linux教程網 All Rights Reserved