#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int fd = open("fcnt", O_RDWR | O_APPEND|O_SYNC );
printf("文件描述符=%d\n", fd);
int flag = fcntl(fd, F_GETFL, 0);
switch (flag & O_ACCMODE) {
case O_RDWR:
printf("O_RDWR\n");
break;
case O_RDONLY:
printf("O_RDONLY\n");
break;
case O_WRONLY:
printf("O_WRONLY\n");
break;
default:
printf("default\n");
break;
}
if (flag & O_APPEND) {
printf("O_APPEND\n");
}
#if defined (O_SYNC)
if (flag & O_SYNC) {
printf("O_SYNC\n");
}
#endif
if (flag & O_NONBLOCK) {
printf("O_NONBLOCK\n");
}
close(1);
fcntl(fd,F_DUPFD,1);
puts("通过标准输出写到文件\n");
return 0;
}
控制台输出
文件描述符=3
O_RDWR
O_APPEND
O_SYNC
sync|fsync|fdatasync
当数据写入文件时,内核通常先将数据复制到一个缓冲区中,如果该缓冲区尚未写满,则不将其排入输出队里,直到其写满或者内核需要使用这块缓冲区做其他使用,这种方式叫做延迟写
好处是,可以减少IO操作,但是带来的风险就是系统发生故障时,会造成数据的丢失
总结起来,数据写入文件分为以下3步:
1.写入缓冲区
2.缓冲区数据排入输出队里
3.将缓冲区数据写入磁盘
void sync (void)
将缓冲区排入输出队里后返回
int fsync (int __fd);
等待数据写入磁盘并且文件属性更新后返回
int fdatasync (int __fildes);
等待数据写入磁盘返回
access
测试实际用户是否有相应权限
int access (constchar *name, int mode)
mode:
R_OK:测试读权限
W_OK:测试写权限
X_OK:测试执行权限
F_OK:测试文件是否存在
文件链接
文件链接分为2种情况
1.硬链接:不会产生新的INODE,IBLOCK,只是在原有数据连接数上+1
不能跨文件系统使用
硬链接目录需要ROOT权限
2.软链接:产生的INODE,IBLOCK,新的IBLOCK记录链接的内容
可以跨文件系统使用
对于软链接来说,有些函数时直接作用链接文件本身,有些函数则跟随源文件链接到源文件
函数
不跟随符号链接
跟随符号链接
access
√
chdir
√
chmod
√
chown
√
√
creat
√
exec
√
lchown
√
link
√
lstat
√
open
√
opendir
√
pathconf
√
readlink
√
remove
√
rename
√
stat
√
truncate
√
unlink
√
link|unlink
创建文件的硬链接
int link (constchar *__from, constchar *__to)
删除一个文件
int unlink (constchar *__name)
说明:对于硬链接来说unlink只是删除文件链接符,文件实际数据的连接数-1,如果为文件实际数据0则在所有进程关闭对此文件连接时删除
举例