打开文件标识
O_RDONLY:只读方式打开
O_WRONLY:只写方式打开
O_RDWR:可读写方式打开
打开文件操作副标识
O_CREAT:若路径中文件不存在则创建,使用Open函数时需同时指定文件权限
O_EXCL:若与O_CREAT连用,检查文件是否已经存在,若不存在则建立文件存在则返回错误,这使创建和测试成为一个原子操作
O_APPEND:读写文件从文件尾部开始移动,所有写入数据都加入文件尾部
O_TRUNC:若文件存在并且可以写入,此标识会将源文件内容清空
O_NONBLOCK:如果打开或创建文件是管道文件,或一个块特殊文件,一个字符特殊文件,该表示代表后续操作非阻塞
文件权限标志
S_IRUSR:用户读权限
S_IWUSR:用户写权限
S_IXUSR:用户执行权限
S_IRWX:用户读写执行权限
S_IRGRP:用户组读权限
S_IWGRP:用户组写权限
S_IXGRP:用户组执行权限
S_IRWXG:用户组读写执行权限
S_IROTH:其他用户读权限
S_IWOTH:其他用户写权限
S_IXOTH:其他用户执行权限
S_IRWXO:其他用户读写执行权限
S_ISUID:SUID权限
S_ISGID:SGID权限
文件同步输入标识
O_SYNC:每次write都等到物理I/O完成才返回,包括文件属性更新I/O操作完成
O_DSYNC: 每次write都等到物理I/O完成才返回,不包括文件属性更新I/O操作完成
O_RSYNC:使每一个以文件描述符作为参数的read的参数等待,直到任何对文件同一部分进行的写操作都完成
重要函数
文件操作
open
用于打开或创建文件
Int open(文件路径,标识,权限标识)
文件路径:绝对路径与相对路径均可
标识:文件标识与操作副标识以及文件同步标识的结合结合
权限标识:是使用权限标识,也可用数字法标识
返回值:成功返回文件标识符.出错返回-1
creat
用于创建文件
int creat(文件路径, 权限标识)
返回值:成功返回文件标识符.出错返回-1
说明:以只写方式打开文件
close
用于关闭文件,当一个进程终止时,内核会自动关闭它打开的所有文件
int close(int fd)
返回值:成功返回0.出错返回-1
sleek
用于设置文件偏移量
off_tsleek(int fd,off_t offset,int whence)
若whence= SEEK_SET,设置当前偏移量为距离文件开始处offset字节
若whence= SEEK_CUR,设置当前偏移量为距离文件当前偏移处offset字节(offset可为正负)
若whence= SEEK_END,设置当前偏移量为文件长度加offset(offset可为正负)
返回值:成功返回新的文件偏移量,失败返回-1 (对于管道文件不能设置偏移文件,因此返回-1)
dup|dup2
复制一个现存的文件描述符
Int dup(intfd)
Int dup(intfd1,int fd2)
Fd1为复制的文件描述符源
Fd2为复制的文件描述符目的地
如果fd2文件为关闭应先关闭
返回值:成功返回新的文件描述符,失败返回-1
举例:
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <stdio.h>
int main() {
int f = open("output", O_CREAT | O_TRUNC | O_RDWR, 0644);
if (f == -1) {
perror("文件创建失败!");
return 0;
}
int newf = dup(f);
write(f, "往文件里写输入!\n", 25);
write(newf, "使用新的文件描述符!\n", 31);
int oldInput = dup(STDOUT_FILENO);
puts("使用标准输出到控制台");
dup2(f, STDOUT_FILENO);
puts("使用标准输出到文件");
dup2(oldInput, STDOUT_FILENO);
puts("还原标准输出到控制台");
return 0;
}
控制台输出:
使用标准输出到控制台
还原标准输出到控制台
output文件内容:
往文件里写输入!
使用新的文件描述符!
使用标准输出到文件
fcnt1
改变已打开文件的文件性质
int fcntl (int fd, int cmd, ...);
主要功能:
1: 复制一个现有描述符:Cmd=F_DUPFD
2:获取/设置文件描述符标注cmd= F_GETFD或F_SETFD
3:获取/设置文件状态标注 cmd=F_GETFL或F_SETFL
4:获取/设置异步I/O所有权 cmd= F_GETOWN或F_SETOWN
5:获取/设置记录锁 cmd= F_GETLK或F_SETLK
Fcntl的文件状态标识
O_RDONLY
O_WRONLY
O_RDWR
O_APPENT
O_NONBLOCK
O_SYNC
O_DSYNC
O_FSYNC
说明:
1:由于 O_RDONLY,O_WRONLY,O_RDWR 只能同时存在一个,因此需要用O_ACCMODE取得访问屏蔽位
2:F_SETFL只能设置O_APPENT,O_NONBLOCK,O_SYNC,O_DSYNC,O_FSYNC
举例: