linux文件系统

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
  
在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;
 }                          
这是我对文件系统的一些理解,希望能帮到大家!









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值