open函数
原型:
int open(const char *pathname,int flags);
int open(const char *pathname,int flags,mode_t mode);
flags
必需选项,必选其中之一
O_RDONLY(只读),O_WRONLY(只写),O_RDWR(读写)
可选:
O_APPEND |
使每次对文件进行写操作都追加到文件的尾端 |
O_CREAT |
如果文件不存在,则创建它,要同时使用第三个参数指定新文件的权限 |
O_EXCL |
查看文件是否存在,如果文件已存在同时指定了O_CREAT,则会产生错误,这样可以安全的打开文件 |
O_TRUNC |
将文件长度截断为0,如果文件存在,并且成功打开,则会将其长度截短为0 |
O_NONBLOCK |
以非阻塞模式打开,默认为阻塞模式,即读写操作需要等待操作的返回状态 |
mode
必须结合flags的O_CREAT使用,否则无效
S_IRWXU |
00700 |
S_IRUSR |
00400 |
S_IWUSR |
00200 |
S_IXUSR |
00100 |
S_IRWXG |
00070 |
S_IRGRP |
00040 |
S_IWGRP |
00020 |
S_IXGRP |
00010 |
S_IRWXO |
00700 |
S_IROTH |
00004 |
S_IWOTH |
00002 |
S_IXOTH |
00001 |
close函数
原型:int close(int fd);
read函数
原型:ssize_t read(int fd,void *buf,size_t count);
返回所读到的字节数
write函数
原型:ssize_t write(int fd,const void *buf,size_t count);
成功返回写入字节数,出错返回-1
写操作函数并不能保证将数据成功地写入磁盘,write()通常将数据写入缓冲区,在合适的时机又系统写入实际的设备,可以调用fsync()显式将输入写入设备。
lseek函数
原型:off_t lseek(int fildes,off_t offset,int whence);
fildes为描述符,offset为偏移大小,whence为操作模式
lseek操作成功返回新的文件偏移量,如果失败返回-1,文件的偏移量可以为负值,所以不能使用返回值是否小于0判断是否成功。要使用是否等于-1判断。
whence:
SEEK_SET |
相对于文件开始处 |
SEEK_CUR |
相对于文件当前位置 |
SEEK_END |
相对于文件结尾的位置 |
允许存在空洞文件
fstat函数
原型:int stat(const char *path,struct stat *buf);
int fstat(int filedes,struct stat *buf);
int lstat(int filedes,struct stat *buf);
成功返回0,错误返回-1
struct stat {
dev_t st_dev;//此文件所处设备的设备ID号
ino_t st_ino; //inode数值
mode_t st_mode; //保护设置
nlink_t st_nlink; //硬链接数
uid_t st_uid; //文件所有者的ID
gid_t st_gid; //文件所有者的组ID
dev_t st_rdev; //设备ID
off_t st_size; //以字节计的大小
blksize_t st_blksize; //文件系统的块大小
blkcnt_t st_blocks; //占用的块的数量
time_t st_atime; //最后访问时间
time_t st_mtime; //最后修改时间
time_t st_ctime; //最后状态改变时间
}
mmap函数
说明:mmap函数将文件或设备空间映射到内存中,可以通过对映射后的内存空间存取来获得与存取文件一致的控制方式。不必再使用read、write函数。映射到的内存不占用空间,仅仅占用一段地址空间
原型:void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offset);
成功返回映射的内存地址,失败返回(void *)-1,通过errno返回错误方式
start指定要映射的内存空间,一般为NULL,表示由系统决定。length为长度,文件从offset处开始,fs通常是open的返回值。
prot表示映射区的保护方式,为一下一个或多个,但都打开时的限制
PROT_EXEC |
映射区域可执行 |
PROT_READ |
映射区域可读 |
PROT_WRITE |
映射区域可写 |
PROT_NOTE |
不能存取 |
flags与open函数的类似。必须为MAP_SHARED或MAP_PRIVARE两者之一的类型。MAX_PRIVATE类型的,每个进程之间的副本是不一样的
MAP_FIXED |
如果start指定了映射地址,而该地址无法获得,则映射失败 |
MAP_SHARED |
共享的映射区域,允许其他进程共享,对映射区写入数据将会写入原来的文件 |
MAP_PRIVATE |
对文件写操作时会产生一个映射文件的复制,即copy on write。对映射区的修改不会影响原文件 |
MAP_ANONYMOUS |
建立匿名映射。此时会忽略参数fd,不涉及文件,而且映射区域无法和其它进程共享 |
MAP_DENYWRITE |
对文件的写入操作将被禁止,只能通过对此映射区的操作。不允许直接对文件进行操作 |
MAP_LOCKED |
将映射区锁定,此区域不会被虚拟内存重置 |
munmap函数
原型:int munmap(void *start,size_t length);
fcntl函数:
原型:int fcntl(int fd,int cmd);
int fcntl(int fd,int cmd,long arg);
int fcntl(int fd,int cmd,struct flock *lock);
操作成功,返回值依赖于cmd,失败返回-1
以下4个有特殊返回值:
F_DUPFD |
返回新的描述符 |
F_GETFD |
获得的相应标志 |
F_GETFL |
文件描述符的状态标志 |
F_GETOWN |
如果是正数则是进程的ID号,负数则是进程组ID号 |
分六类功能:
F_DUPFD |
复制文件描述符 |
F_GETFD/F_SETFD |
获得/设置文件描述符 |
F_GETFL/F_SETFL |
获得/设置文件状态值 |
F_GETOWN/F_SETOWN/F_GETSIG/F_SETSIG |
获得/设置信号发送对象 |
F_GETLF/F_SETLK/F_SETLKW |
获得/设置信号锁 |
F_GETLEASE/F_SETLEASE |
获取/设置文件租约 |
对前四种进行介绍:
F_DUPFD用于复制文件描述符fd,获得新的文件描述符作为函数值返回。获得的文件描述符是尚未使用的描述符中大于或等于第3个参数值中最小值。
F_GETFD获得文件描述符
F_SETFD设置文件描述符
F_GETFL标志获得文件描述符fd的文件状态标志。标志含义如下:
O_RDONLY |
只读 |
O_WRONLY |
只写 |
O_RDWR |
读写 |
O_APPEND |
写入是添加至文件尾部 |
O_NONBLOCK |
非阻塞方式 |
O_SYNC |
写等待 |
O_ASYNC |
同步方式 |
三种存取方式(O_RDONLY、O_WRONLY、O_RDWR)三种方式不是各占一位,而是0、1、2,要正确的获取他们的值,只能用O_ACCMODE获得存取位。
F_SETFL只能修改以下标志位:O_APPEND、O_ASYNC、O_SYNC、O_DIRECT、O_NOATIME、O_NOBLOCK
ioctl函数
原型:int ioctl(inf d,int request,...);
取决于具体驱动程序的编写。
本文出自 “重剑无锋” 博客,请务必保留此出处http://qianyang.blog.51cto.com/7130735/1614926
原文地址:http://qianyang.blog.51cto.com/7130735/1614926