分类:
2012-12-11 21:56:36
原文地址:linux文件操作(二)高级文件读写 作者:HYYLINUX
#include
#include
#include
int open(const char *pathname, int oflag, …/*, mode _t mode * / ) ;
功能:打开文件
返回: 若成功为文件描述符,若出错为 -1,出错时errno被设置
pathname 是要打开或创建的文件的名字。
oflag 参数可用来说明此函数的多个选择项。
对于 open 函数而言 ,仅当创建新文件时才使用第三个参数。
注 : 第 三参数 … , I S O C 表示参数类型和个数不定 .
oflag 值:
O_R DONL Y:只读打开;
O_WRONL Y:只写打开; 此三者必选其一
O_R D WR:读、写打开
O_APPEND:每次写时都加到文件的尾端
O_CR EAT:若此文件不存在则创建它。使用此选择项时,需同时说明第三个参数mode ,用其说明该新文件的存取许可权位
O_EX CL:如果同时指定了 O_CR EAT ,而文件已经存在,则出错。这可测试一个文件是否存在,如果不存在则创建此文件成为一个原子操作
O_TRUNC:如果此文件存在,而且为只读或只写成功打开,则将其长度截短为 0
O_NOCTTY:如果 pathname 指的是终端设备,则不将此设备分配作为此进程的控制终端
O_NON BLOCK:如果 pathname 指的是一个 FIFO 、一个块特殊文件或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的 I / O 操作设置非阻塞方式
O_SYNC:使每次 write 都等到物理 I / O 操作完成
MODE
S_ I RWX U | 用户主的读写和 执行权 |
S_ I RU SR | 用户读 |
S_ I W USR S_ I X USR | 用户写 用户 执行 |
S_ I RWXG | 组的读写 执 行 |
S_ I RGRP | 组读 |
S_ I WGRP | 组写 |
S_ I XGRP | 组执 行 |
S_ I RWX O | 其它 人的读写 执 行 |
S_ I ROTH | 其它 人读 |
S_ I W OTH | 其它 人写 |
S_ I X OTH | 其它 执行 |
creat 函数
# include
# include
# include
int creat(const char * pathname, mode _ t mode) ;
功能: 创建一个新的文件。
返回: 若成功为 只 写打开的文件描述符, 若出错为 - 1 。
注意,此函数等效于:. open (pathname, O _WR ONL Y | O _CR EAT | O_TRUNC, mode) ;
creat 的一个不足之处是它以只写方式打开所创建的文件。
close 函数
# include
int close (int filedes) ;
功能:关闭一个打开文件
返回: 若成功为0 ,若出错为 - 1
当一个进程终止时,它所有的打开文件都由内核自动关闭。很多程序都使用这一功能而不显式地用close关闭打开的文件。
lseek 函数
每个打开文件都有一个与其相关联的“当前文件偏移量”。它是一个非负整数,用以度量从文件开始处计算的字节数。通常,读、写操作都从当前文件偏移量处开始,并使偏移量增加所读或写的字节数。按系统默认 ,当打开一个文件时,除非指定O _APP END 选择项,否则该位移量被设置为 0 。
可以调用 lseek 显式地定位一个打开文件。
# include
# include
off _ t lsee k (int filesdes, off _t offset, int whence) ;
功能:设置文件内容读写位置
返回: 若成功为新的文件位 移 ,若 出错为 - 1 。
对参数 offset 的解释与参数 whence 的值 有关。
若whence是SEEK_SET,则将该文件的位移量设置为距文件开始处offset 个字节。
若whence是SEEK_CUR,则将该文件的位移量设置为其当前值加offset,offset 可为正或负。
若 whence 是SEEK_END,则将该文件的位移量设置为文件长度加 offset,offset 可为正或负。
read 函数
#include
ssize_t read(int fd, void *buf, si ze_t count);
功能: 从打开文件中读数据
返回:读到的字节数,若已到文件尾为0,若出错为- 1。
有多种情况可使实际读到的字节数少于要求读字节数:
读普通文件时,在读到要求字节数之前已到达了文件尾端。例如,若在到达文件尾端之前还有30个字节,而要求读100个字节,则read返回 3 0 ,下一次 再调用read时,它将返回0(文件尾端)。当从终端设备读时,通常以行为单位,读到换行符就返回。
当从网络读时,网络中的缓冲机构可能造成返回值小于所要求读的字节数。
某些面向记录的设备,例如磁带,一次最多返回一个记录。
读操作从文件的当前位移量处开始,在成功返回之前,该位移量增加实际读得的字节数。
write 函数
#include
ssize_t write(int fd, const void *buf, size_t count);
功能;向打开文件写数据。
返回:若成功为已写的字节数,若出错为-1。
其返回值通常与参数count的值不同,否则表示出错。write出错的一个常见原因是:磁盘已写满,或者超过了对一个给定进程的文件长度限制。
对于普通文件,写操作从文件的当前位移量处开始。如果在打开该文件时,指定了O_APP END选择项,则在每次写操作之前,将文件位移量设置在文件的当前结尾处。在一次成功写之后,该文件位移量增加实际写的字节数。
pread & pwrite 函数
ssi ze_t pread(int filedes, void *buffer, size_t size, off _t offset)
ssi ze_t pwrite(int filedes, const void *buffer, size_t size, off _t offset)
类似于read和write,只是读写不是从文件当前位置开始,而是从offset位置开始,并且函数执行完后也不影响当前文件指针位置,即指针位置不改变。
fcntl 函数
#include
#include
int fcntl(int filedes, int cmd, ... ) ;
功能:改变已经打开文件的性质
返回:若成功则依赖于cmd(),若出错为-1。
fcntl 函数有五种功能:
复制一个现存的描述符,新文件描述符作为函数值返(cmd=F_DUPFD)。
获得/设置文件描述符标记,对应于filedes的文件描述符标志作为函数值返回.(cmd=F_GET FD或F_SETFD)。
获得/设置文件状态标志,对应于filedes的文件状态标志作为函数值返回。(cmd=F_GETFL或F_SETFL)。
获得/设置异步I/O(cmd=F_GETOWN或F_SETOWN)。
获得/设置记录锁(cmd=F_SETLK,F_SETLKW)
文件状态 | 标志说明 |
O _R DONL Y | 只读打开 |
O _WR ONL Y | 只写打开 |
O _R D WR | 读 / 写打开 |
O_APP END | 写时都添加至文件尾 |
O _ NON B LOC K | 非阻塞方式 |
O _SY NC | 等待写完成 |
O _ASY NC | 异步 I / O |
ioctl 函数
ioctl函数是I /O操作的杂物箱。不能用本章中其他函数表示的I/O操作通常都能用ioctl表示。终端I/O是ioctl的最大使用方面,主要用于设备的I/O控制。
#include
int ioctl(int filedes, int request, . . . ) ;
返回:若出错则为-1,若成功则为其他值。
例如:串口线上传送的数据通过read、write来操作,而串口的波特率、校验位、停止位可以通过ioctl来设置。
测试文件类型
类型,即文件的分类(例如:它是一个普通文件,还是符号链接,还是某种特殊文件)
使用 stat 函数取得文件的状态信息以进行测试
#include
int stat(const char * path, struct stat *sbuf);
stat提供有关文件的丰富信息,包括大小、所有者、组、最后修改时间等。
int fstat(int fd, struct stat *sbuf);
fstat功能和stat相同,只是通过文件描述符来进行操作,而不是通过文件名。
函数出错返回 -1 ,否则返回 0
struct stat 结构
struct stat {
mode_t st_mode; // 文件对应的模式,文件, 目录等
ino_t st_ino; //inode 节点号
dev _t st_dev; // 设备号 码
dev _t st_rdev; // 特殊设 备号 码
nlink_t st_nlink; // 文件的连接数
uid _t st_uid; // 文件所 有者
gid_t st_gid; // 文件所 有者 对应的组
off_t st_siz e; // 普通文件,对应的文件字节数
time_t st_atime; // 文件最后被访问的时间
time_t st_mtime; // 文件内容 最后被修改的时间
time_t st_ctime; // 文件状态改变时间
blksiz e_t st_blksiz e; // 文件内容对应的块 大小
blkcnt_t st_blocks; // 文件内容对应的块数量
}
对 stat 进行文件测试的宏
如 S_ I S DIR(sbuf.st _mode)
宏 | 说明 ( 如果文件是该类型则返回 1 ,否则返回 0) |
S_ ISREG | 普通文件 |
S_ ISDIR | 目录 |
S_ ISCHR | 特殊字符文件 |
S_ ISBL K | 特殊块文件 |
S_ ISLNK | 符号链接 |
S_ ISFIFO | 特殊 FIFO 文件 |
S_ ISSOCK | 套接字 |
相关函数
struct passwd *getpwuid(uid _ t uid);
Get User Information for User ID.
#include
struct passwd * pwd = getpwuid(statbuf.st _uid);
if(pwd) printf(“File Ower: %s \n”, pwd->pw _name);
struct group *getgrgid(gid _t gid);
Get Group Information Using Group ID.
#include
struct group * grp = getgrgid(statbuf.st _gid);
if(grp) printf(“File Group: % s \n”, grp->gr _name);
确定当前工作目录
char *getcwd(char *buf, si ze_t siz e); //G et Current Director y.
long pathconf(const char *path, int name); //G et Configurable Path Name Variables.
char * get_current_dir _name(void); // 同 getcwd(NULL, 0)
int chdir (const char *filename); //set the process ’s working directory to filename
int fchdir (int filedes); //set the process’s working directory to directory associated with the file descriptor filedes.
# include
long maxpathlen = pathconf(“.”,_PC _PATH_MAX); //获取路径最大长度
char * pathname = (char *)malloc(maxpathlen);
getcwd(pathname, (si z e_t)maxpathlen);
printf(“ %s\n”,pathname);
列举目录
DIR *opendir(const char *dirname); //Open Directory
DIR * fdopendir(int fd);
struct dirent *readdir(DI R *dirp); //Read Directory Entry
int closedir(DI R *dirp); //Close Directory
void rewinddir(DI R *dirstream); //reinitiali ze the directory stream dirstream
long int telldir(DI R *dirstream); //returns the file position of the directory stream dirstream.
void seek dir(DI R *dirstream, long int pos); //sets the file position of the director y stream dirstream to pos.
# include
# include
# include
int main(void)
{
DI R *dp;
struct dirent *ep;
dp = opendir("./");
if(dp != NULL)
{
while(ep = readdir(dp))
puts(ep->d_name);
closedir(dp);
} else
perrory ("Couldn 't open the directory");
return 0;
}
使用 inotify 进行文件事件通知
内核 2 .6 的新特点之一就是支持文件系统事件通知,这个新机制名为inotify,表明它提供的是inode事件的通知。
Beagle 搜索工具使用inotif y自动地把文件系统的改变通知执行索引,这样就避免了周期性的扫描文件系统的改变,从而提高效率。
#include
int inotif y_init(void)
int inotif y_add _watch(int fd, const char* pathname, int mas k )
int inotif y_rm _watch(int fd, int wd)
从文件系统删除文件
#include
int remove(char * filename)
功能:从文件系统中删除文件,不管是文件还是目录都行。是文件时同unlink,是目录时同rmdir。
成功返回 0 ,失败返回 -1 。