一、函数介绍
①open---打开或创建一个文件
open(char *, flag, mode)在fcntl.h声明中。最多有三个参数:
功能:打开或创建一个文件
参数:第一个参数,char * 包含有文件名和路径
第二个参数,flag 打开文件参数
第三个参数,mode 创建文件和权限
flag内容: flag | 功能
O_RDONLY | 只读
O_WRONLY | 只写
O_RDWR | 读写
O_CREAT | 创建一个文件
O_EXCL | 如果使用O_CREAT时文件存在,则可返回错误消息。这一参数可测试文件是否存在。
O_TRUNC | 打开文件(会把已经存在的内容给删除)
O_APPEND | 追加方式打开文件(不会把已经存在的内容删除)
返回值:成功---返回文件描述符,它是一个非负的正整数,即文件的ID号,相当于人的身份证号;
出错---返回-1
二、代码示例
/*
功能:创建一个文件
*/
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int fd = open(argv[1], O_CREAT | O_RDWR, 0777);
if(fd < 0 )
{
printf("creat file %s failed!
", argv[1]);
return -1;
}
printf("create file %s failed!, fd = %d
", argv[1], fd);
close(fd);
return 0;
}
三、结果展示
如上图所示:我们实现了和touch一样的功能,此时可以看出我们生成的文件权限为755
① 生成的文件权限值是怎么来的呢?
我们代码中写的权限是777,我们生成文件的权限是755,说明这和代码中写的权限没有关系
生成文件的权限=mode & (~umask)
首先查看我们linux下的umask值:
可以看到我们umask值是022,前面第一个0代表八进制
将它们转换为二进制:
777 ---- 111 111 111
022 ---- 000 010 010
umask取反111 101 101
最后跟前面777的二进制作与运算,结果为:111 101 101,即755