linux中体现了“一切皆文件”的思想,所以Linux中文件就显得尤为重要。
一、文件的创建
int creat(const char* pathname, mode_t mode)
第一个参数就不说了,大家都懂的,mode指的是新建文件的存取权限,它和umask一起决定文件最终权限。至于mode都有哪些权限,一会说。
二、文件打开
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_EXEC | 使用了O_CREAT而且文件已经存在,就会放生一个错误 |
O_NOBLOCK | 非阻塞的方式打开 |
O_TRUNC | 如果文件已经存在,删除文件内容 |
int open(const char *pathname, O_CREAT | O_TRUNC, mode);
使用上面我们就可以创建一个文件,和creat差不多。
下面我们来看一些常用的文件访问权限(mode):
S_IRUSR | 用户可以读 |
S_IWUSR | 用户可以写 |
S_IXUSR | 用户可以执行 |
S_IRWXU | 用户可以读、写、执行 |
S_IRGRP | 组可以读 |
S_IWGRP | 组可以写 |
S_IXGRP | 组可以执行 |
S_IRWXG | 组可以读、写、执行 |
S_IROTH | 其他人可以读 |
S_IWOTH | 其他人可以写 |
S_IXOTH | 其他人可以执行 |
S_IRWXO | 其他人可以读、写、执行 |
S_ISUID
| 设置用户执行ID |
S_ISGID | 设置组的执行ID |
假如我们创建一个用户可读、可写、可以执行,没有组权限,其他人可以读、不可以写、可以执行,并且设置用户ID,如图
通过上面的分析,我们来创建一个文件
open("test", O_CREAT | O_TRUNC, 10705)等价于
open("test", O_CREAT | O_TRUNC, S_ISUID | S_IRWXU | S_IROTH | S_IXOTH);
三、读和写
文件打开之后,我们要进行读和写,Linux中提供的读写函数:
int read(int fd, const void *buf, size_t length);
int write(int fd, const void *buf, size_t length);
buf 是缓冲区的指针,length为缓冲区大小(以字节为大小),read函数就是文件描述符fd所指定的文件中length个字节读取到buf所指向的缓冲区,返回实际读取的字节
数。write函数就是把buf所指向的缓冲区中length个字节写到文件描述符fd所指定的文件中,返回实际写入的字节数。
四、定位
随机指定位置进行读写,Linux提供的函数:
int lseek(int fd, offset_t offeset, int whence);
lseek函数将文件读写指针相对于whence位置移动offeset个字节,成功,返回指针相对于文件头的位置。
参数whence可以使用下面参数:
SEEK_SET:相对文件开头
SEEK_CUR:相对文件读写指针的当前位置
SEEK_END:相对文件末尾
举个列子:
lseek(fd, -3, SEEK_CUR);
将文件指针相对当前位置向前移动3个字节。
切记:lseek函数返回值是文件头的位置
列如:
lseek(fd, 0, SEEK_END);
上面这个函数返回的就是文件的长度。
五、关闭
如果我们要关闭文件,只要调用close就行,函数如下:
int close(int fd);
这个比较简单,想必大家都知道,就不说了
我给大家举一个简单列子:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main()
{
//write file
int fd;
fd = open("t.txt", O_CREAT | O_TRUNC | O_RDWR, S_ISUID |S_IRWXU);
if(fd < 0)
{
return 1;
}
char buf[] = "hello world!";
ssize_t size = 0;
size = write(fd, buf, strlen(buf));
if(size < 0) {
return 2;
}
printf("write Successful!\n");
close(fd);
//read file , output to the screen
fd = open("t.txt",O_RDWR);
if(fd < 0)
{
return 0;
}
size = read(fd, buf, sizeof(buf));
if(size < 0)
{
return 3;
}
buf[size] = '\0';
printf("%s\n",buf);
close(fd);
return 0;
}
这是我对文件系统的一些理解,希望能帮到大家!