linux文件系统

来源:互联网 发布:nginx lua 连接redis 编辑:程序博客网 时间:2024/06/07 17:38

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

设置用户执行IDS_ISGID设置组的执行ID  在Linux中支持数字设置权限,利用数字设置权限,我们必须搞懂他们的含义,Linux用用5个数字来表示文件各种权限:第一位表示设置用户ID,第二位表示设置组ID,第三位表示用户自己权限,第四位表示组的权限,第五位表示其他人的权限,每个数字可以取1(读权限)、2(写权限)、4(执行权限)、0(无)、也可以取这些值的和。

假如我们创建一个用户可读、可写、可以执行,没有组权限,其他人可以读、不可以写、可以执行,并且设置用户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; }                          
这是我对文件系统的一些理解,希望能帮到大家!









0 0
原创粉丝点击