初学Linux--文件

Linux文件系统简述

逻辑磁盘分区管理
在Linux中,逻辑磁盘分区是基本的文件存储单元,逻辑磁盘是物理磁盘进行逻辑划分,从而形成逻辑上的磁盘分区。Linux将每个逻辑划分是为独立的磁盘,每个逻辑磁盘在Linux系统中表现为一个单独的设备文件。逻辑磁盘分区是建立Linux文件系统的基础,只有创建了磁盘分区后,才能在分区上建立文件系统。建立磁盘逻辑分区可通过执行命令fdisk完成:fdisk -l/*-l表示要获取分区信息*/
磁盘分区有一个叫交换分区swap,功能是在内存紧张时,将物理内存的部分数据按一定的调度算法交换出来,以供当前正在运行的程序使用。
文件系统的建立与挂载
在分区之后还需要对新增的逻辑分区进行格式化。建立文件系统的过程就是用相应格式化工具格式化逻辑分区的过程。执行分区格式化的命令是mkfs。用户在实际使用中应该通过执行mkfs.fstyle命令建立各种不同文件系统
Linux支持多种文件系统,常见的有:
- ext2:Linux中自带的文件系统类型。Linux早期版本一只是哟个ext2作为操作系统默认使用的文件系统
- ext3:ext2的后续版本,加入了文件系统日志的管理机制
- swap:交换分区,由系统自动管理,用户vu需要对其进行过多的操作
- vfat:Linux把DOS所有FAT文件系统统称为vfat
- ISO9660:光盘使用的标准文件系统
- 日志文件系统
文件系统建立后需要挂载在系统中菜呢个通过文件管理系统对其进行访问。挂载是将逻辑磁盘分区与文件系统的指定目录之间建立关联。Linux没有盘符的概念,而是挂在到某个指定的目录。
挂载文件系统有两种方式:
1.通过mount手工挂载,使用于光盘,软盘等不需要经常使用的设备,使用完毕后可以通过umount命令将文件系统卸载;
2.通过fstab文件进行自动挂载,对于系统运行必须使用或长期使用的文件系统,需要设置其在系统运行时自动运行挂载。在Linux启动时init进程会自动读取/etc/fstab中的配置内容挂载相应的文件系统。
虚拟文件系统
由于Linux支持多种文件系统,必须使用一种统一的接口对文件系统进行管理,也就是虚拟文件系统(VFS)。
文件类型
Linux文件类型常见的有普通文件、目录文件、设备问价、链接文件、管道文件
- 普通文件:不包括文件系统的结构信息
- 目录文件:用于存放文件名及其相关信息的文件,是内核组织文件系统的基本节点。
- 设备文件:Linux系统为外部设备提供一种标准接口,将外部设备视为一种特殊的文件。通常设备文件在/dev目录下
- 链接文件:实际上是指向一个真实存在的文件的链接。类似与快捷方式
- 管道文件:用于不同进程间的信息传递。
文件权限
Linux系统下文件权限管理包括两种不同的类型:1.传统方式的文件权限管理,也称UGO(user group other);2.访问控制列表方式的武安县管理,即ACL(Access Control List)方式。

UGO方式的权限管理主要是通过文件的9个权限控制位对文件访问进行控制的。者9个权限控制位可分为3组:文件拥有者、与文件归属的用户组同组用户的权限及其他用户的访问权限。对于每一组权限位可以划分读写执行,r、w、x。可以通过chmod修改权限。用字母修改权限时,用+表示增加权限,-表示删除权限。用数字修改时,将9位的权限按照文件拥有者、组内用户及其他用户分组每组内的三位权限转换为八进制数字表示。转换的具体方式:增加权限,该位置置1,否则0,然后每三位一组,转为八进制。
通常新建文件的权限还与另外一个因素有关,就是当前用户的文件权限掩码。这个掩码可以通过访问环境变量UMASK得,可以通过执行命令umask进行修改。作用过程:新建文件时,将UMASK值按二进制取反,与指定的文件权限位进行与操作,以此来决定文件最终的权限。UMASK对于文件和目录不同,对于文件,UMASK的设置是在假定文件拥有八进制666权限上进行的,新建文件的权限就是666减去UMASK的掩码数值。对于目录,UMASK的设置是在假定文件拥有八进制777权限上进行,目录八进制权限777减去UMASK的掩码数值。UMASK变量一般通过用户相关的shell的配置文件进行定义。

ACL能够为每个用户对文件和目录的访问提供更好的访问控制。要启用ACL,需要在mount挂载文件系统时执行-o acl完成。为了开机后直接应用ACL,可以将这一选项写入/etc/fstab中。ACL有一种最小化的模式,同UGO相同。另外一种是扩展模式,还包括一个掩码项及多个命名用户权限项或者命名用户组权限项。命名用户权限就是单独为某个用户分配相应权限。
ACL权限管理有6中规则:
- ACL_USER_OBJ:用户属主权限
- ACL_GROUP_OBJ:用户组属主权限
- ACL_OTHER:其他用户权限
- ACL_USER:为某个用户添加的权限
- ACL_GROUP:为某个用户组添加的权限
- ACL_MASK:规定ACL_USER、ACL_GROUP、ACL_GROUP_OBJ的最大值。

文件操作

文件编程基本概念
1.文件描述符
一个非负整数,取值为0~OPENMAX。当进程创建一个新文件或者打开现有的文件时,系统将向进程返回一个文件描述符。当对文件进行I/O操作时,大多数函数都用文件描述符作为参数,代表要操作的文件/
2.标准输入、输出、错误输出
三者的文件描述符分别是0、1、2。
3.设置-用户-ID与组-ID
每个文件都有自己的文件属主(用户ID)及组(组ID)。如果这个文件是可执行的程序,那么当该文件被执行时就会在操作系统中形成进程。每个进程都有一个有效用户ID和一个有效组ID。这两个与进程相关的ID的作用是进行文件存取许可检查。此外,每个进程还有一个实际用户ID和实际组ID。LInux提供了一种特殊的机制,可以在文件的属主权限中设置一个标志。这个标志的作用是:当执行该文件时,将进程的有效用户ID设置为该文件所有者的ID这种机制称为设置-用户-ID(suid),对于组的权限也可以这样设置称为设置-组-ID(sgid)。suid可以通过chmod u+s完成。
在Linux系统中用户的口令文件在/etc/passwd和/etc/shadow中。这个文件只对于root用户可以写。在普通用户执行passwd命令修改口令时,之所以能够向shadow文件写入数据是由于/usr/bin/passwd设置了suid权限,普通用户在通过执行passwd命令修改口令时,有效用户会变成root,所以可以完成对口令文件的修改。
文件的创建与打开、读写、关闭和删除
creat:创建一个普通文件

#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int creat(const char*pathname,mode_t mode)

open:打开一个现有文件或创建一个文件

#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int open(const char*pathname,int oflag,.../*mode_t mode*/)

oflag:打开方式:
- O_RDONLY:只读
- O_WRONLY:只写
- O_RDWR:读写
- O_APPEND:追加
- O_CREAT:不存在则创建
- O_EXCL:如定义了上者,且文件存在,则出错
- O_TRUNC:如文件存在,且以只读或只写打开,则截断文件
mknod:创建设备文件
mkdir:创建目录文件

read:从一个打开的文件中的读取数据

#include<unistd.h>
ssize_t read(int filedes,void *buff,size_t nbytes)

write:向一个打开的文件写数据

#include<unistd.h>
ssize_t write(int filedes,const void *buff,size_t nbytes)

close:文件描述符使用完后,关闭文件描述符

#include<unistd.h>
int close(int filedes)

unlink:将文件的引用计数减一,引用计数为零时删除

#include<unistd.h>
int unlink(const char*path)

文件的随机存取
在Linux中,每个被打开的文件都有与其相关联的“当前文件唯一”用以度量从文件开始处到到文件读写指针位置的字节数。
lseek函数可以调用当前文件位移。lseek仅将当前位移量记录到内核的数据结构中:

#include<sys/types.h>
#include<unistd.h>
off_t lseek(int fd,off_t offset,int whence)

fd:文件描述符
offset:文件偏移量,偏移基准由whence来定
whence:偏移依据

文件安全编程

每个文件只有唯一的用户属主和属于唯一的组,文件的属主信息可由l命令得到。超级用户和文件拥有者可以通过系统调用对文件属主进行更改设置。

#include<sys/types.h>
#include<unistd.h>
int chown(const char*pathname,uid_t owner,gid_t group)//修改文件的属主
int fchown(int fd,uid_t owner,gid_t group)
//对已打开的文件修改
int lchown(const char*pathname,uid_t owner,gid_t group)
//修改符号链接本身的属主
,而不是符号连接所指向的文件

设置文件权限(UGO)
通过chmod设置文件权限

#include<sys/types.h>
#include<sys/stat.h>
int chmod(const char*pathname,mode_t mode);
int fchmod(int fd,mode_t mode);

通过umask为进程设置文件权限屏蔽字

#include<sys/types.h>
#include<sys/stat.h>
mode_t umask(mode_t mask);

设置文件权限(ACL)
要进行ACL编程,首先要具备三个条件:
1.系统内核支持ACL,查看/bool/config-版本号-default
2.文件系统支持ACL,不带参数的mount命令可查询
3.需要安装ACL开发包libacl-devel

acl_t是基本数据结构,acl_t包含若干个acl_entry_t,每个entry定义了一个权限结构,每个权限结构包含3部分内容:权限分配的对象类型acl_tag_t、权限分配的用户IDacl_psermset_t、分配的权限qualitifier_obj。
1.acl_set_file、acl_set_fd函数:用于设置文件的ACL信息

#include<sys/types.h>
#include<sys/acl.h>
int acl_set_file(const char*path_p,acl_type_t type,acl_t acl);
int acl_set_fd(int fd,acl_t acl);

path:文件路径;
fd:文件描述符
type:修改权限的方式
acl结构如下:

struct posix_acl{
        atomic_t a_refcount;//结构的引用计数
        unsigned int a_count;//a_entries地址中保存的acl权限数
        struct posix_acl_entry a_entries[0];//acl权限数组的基地址

2.acl_get_file、acl_get_fd函数:用于获得文件的ACL信息

#include<sys/types.h>
#include<sys/acl.h>
acl_t acl_get_fd(int fd);
acl_t acl_get_file(const char*path_p,acl_type_t type);

3.acl_creat_entry函数:用于创建一个新的权限项。
在进行文件权限的ACL设置时,一般需要先创建一个权限项。每个权限项都包含tag、qualitifier、permset,在创建新的权限项后,调用其他函数对这3项进行填充。

#include<sys/types.h>
#include<sys/acl.h>
int acl_creat_entry(acl_t*acl_p,acl_entry_t*entry_p);
/*acl_p:ACL基本数据结构指针;
entry_p:新建权限项的指针,其结构如下*/
struct posix_acl_entry{
short e_tag;//权限类型
unsigned short e_perm;//权限,如ACL_READ、ACL_WRITE、ACL_EXECUTE
unsigned int e_id;//用户ID或者组ID
}

4.acl_set_tag_type、acl_set_qualifier、acl_add_perm、acl_get_permset、acl_set_permset函数用来对权限项的内容进行设置

#include<sys/types.h>
#include<sys/acl.h>

int acl_set_tag_type(acl_entry_t entry_d、acl_tag_t tag_type);
acl_set_qualifier(acl_entry_t entry_d、const void*tag_qualifier_p)
acl_add_perm(acl_permset_t permset_d、acl_perm_t perm)
acl_get_permset(acl_entry_t entry_d、acl_permset_t*permset_p)
acl_set_permset(acl_entry_t entry_d、acl_permset_t*permset_p)
/*entry_d:acl_entry_t类型变量
tag_type:分配权限的类型
perm:权限信息
permset_d:权限信息的集合*/

文件属性编程

文件状态的获取

#include<sys/types.h>
#include<sys/stat.h>
int stat(const char*file,struct stat*buf);
int fstat(int fd,struct stat*buf);
int lstat(const char*file,struct stat*buf);//buf指向stat结构的指针,用于保存获的文件状态数据

文件系统状态的获取

#include<sys/types.h>
#include<sys/statfs.h>
int statfs(const char*file,struct statfs*buf);

修改文件时间
每个文件,Linux记录了3个时间:文件数据的存取时间、文件数据的修改时间、i节点状态的修改时间。修改时间(st_mtime)是内容最后一次被修改的时间。更改时间(st_ctime)是i节点最后一次被修改的时间。修改文件属性操作修改的都是i节点状态。文件的存取时间和修改时间通过系统调用utime维护

#include<sys/types.h>
#include<utime.h>
int utime(const char*file,const struct utimebuf*times);
//times结构如下:
struct utimebuf{
_time_t actime;//存取时间
_time_t modtime;//修改时间
}

目录编程

工作目录和用户主目录
使用系统时处于的目录就是工作目录;
用户主目录是创建用户时创建的,在日常应用中,用户可以通过~来引用自己的目录
目录的创建

#include<sys/types.h>
#include<sys/stat.h>
int mkdir(const char*path,mode_t mode);

目录的删除

#include<sys/types.h>
#include<sys/stat.h>
int rmdir(const char*path);

获取和改变工作目录

#include<unistd.h>
int chdir(const char*path);//变更当前工作目录
int fchdir(int fd);
char*getcwd(char*buf,size_t size);//获得当前工作目录

目录的读取

#include<sys/types.h>
#include<dirent.h>
DIR*opendir(const char*pathname);//打开目录
struct dirent*readdir(DIR*dp);//读取目录
void rewinddir(DIR*dp);//重定位目录的读指针
int closedir(DIR*dp);//关闭目录

参考文献《Linux编程从入门到精通》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值