Linux文件及目录学习笔记

       此文章是对Linux基础知识的简单记录,方便以后回顾,所记的知识点不是系统性的记录,整理的不足之处会实时修改。

1.文件操作分类

       文件操作可分为带缓冲区和不带缓冲区的文件操作,带缓冲区的文件操作快,可移植性强。
        不带缓冲区的文件操作: 属于低级文件操作,需要用户在自己的程序中为每个文件设置缓冲区。遵循POSIX标准的系统I/O试用的就是不带缓冲区的文件操作,系统I/O接口也称为I/O系统调用,如open、read、write和lseek等。
        带缓冲区的文件操作: 属于高级文件操作,系统将在用户空间中自动为正在使用的文件开辟内存缓冲区。遵循ANSI标准的I/O操作使用的就是带缓冲区的文件操作,标准I/O接口也称为I/O库函数,如fopen、fread、fwrite、flush和fseek等。

       系统调用和库函数的本质区别:调用系统调用会陷入Linux内核,调用库函数不会陷入Linux内核。
       系统调用是为了方便使用操作系统的接口,而库函数则是为了人们编程的方便。

2.Linux目录树

在这里插入图片描述
       /bin:用于存放普通用户可执行的命令,系统中的任何用户都可以执行该目录中的命令,如ls、cp、mkdir。
       /boot:Linux内核及启动系统时所需要的的文件,为保证启动文件更加安全可靠,通常把该目录存放在独立的分区上。
       /dev:设备文件的存储目录,如磁盘、光盘等。
       /etc:用于存放系统的配置文件,比如用户账号及密码存放在配置文件/etc/password和/etc/shadow中。
       /home:普通用户的主目录,每个用户在该目录下都有一个与用同名的目录。
       /lib:用于存放各种库文件。
       /proc:该目录是一个虚拟文件系统,只有在系统运行时才存在。通过访问该目录下的文件,可以获取系统状态信息并且修改某些系统的配置信息。可以使用cat、strings命令来查看这些信息,如在Shell下输入cat/proc/meminfo命令可以获取系统内存的使用情况,输入man proc命令获取关于proc的详细信息。
       /root:超级用户root的主目录。
       /sbin:存放的是用于管理系统的命令。
       /tmp:存放的是临时文件。
       /usr:用于存放系统应用程序及相关文件,如说明文档、帮助文档等。
       /var:用于存放系统中经常变化的文件,如日志文件、用户文件等。

3.文件访问权限

       Linux有三种不同类型的用户可对文件或目录进行访问,分别是:文件所有者,同组用户、其他用户。

       例:文件类型+访问权限              drwxr-xr-x
       文件类型+访问权限共由10位构成,第一位表示文件类型。文件类型缩写汇总说明如下:
       -(regular):普通文件。
       d(directory):目录文件。
       c(character):字符设备文件。
       b(block):块设备文件。
       p(pipe):管道文件(命名管道)。
       s(socket):套接字文件。
       l(link):链接文件(软链接即符号链接)。
       剩下9位表示文件的访问权限。按照每3位为一组分为三组,第一组表示文件所有者对该文件的操作权限;第二组表示与文件所有者同组(group)的用户对该文件的操作权限;第三组表示其他用户对该文件的操作权限。r表示读权限,w表示写权限,x表示可执行权限。

       文件访问权限的修改在Shell环境中可通过chmod命令来实现。如:chmod 666 test.c
       其中三个六分别表示所有者、所属组和其他用户具有的权限。每个6都是通过计算所得,r=4,w=2,x=1。6=4+2,所以数字6表示具有读和写权限,无可执行权限。

       文件类型与访问权限被定义在一个名为st_mode的内核数据结构中,st_mode实质上是一个无符号16位短整型数,文件类型和权限被编码在这个数中,如下图:
在这里插入图片描述
       其中低9位st_mode[0:8]一一对应代表了文件的各种用户权限,分为3组,对应3种用户,他们是文件所有者、同组用户和其他用户,r为读权限,w为写权限,x为执行权限。
       高4位即st_mode[12:15],用作文件类型,最多可以标识16种类型,目前已经使用了7个。

4.关于文件描述符

       文件描述符的取值范围在0~NR_OPEN(值为255)之间,即每个进程最多只能打开256个文件。
       当一个程序开始运行时,编号0、1、2的三个文件描述符已经默认打开,因此用户使用的文件描述符最小从3开始。文件描述符0代表标准输入文件,一般是键盘;文件描述符1代表标准输出文件,一般是显示器;文件描述符2代表标准错误输出文件,一般也值显示器。

5.Linux下可执行文件(ELF)和进程的区别

(1)在ELF类型的可执行文件中,程序代码、数据是分开存放的。在Linux操作系统中,一个可执行文件的结构如图所示:
在这里插入图片描述
①代码段(text):存放程序的二进制代码,通常是只读的,所以可以将其设置为共享的,这样,对于频繁被执行的程序,就可以只保留一份代码,其他可执行程序需要调用该程序时,读这一份代码就可以。
②全局初始化数据区/静态数据区(data):通常称为数据段,用来存储在程序中明确被初始化的全局变量、已经初始化的静态变量(包括全局静态变量和局部静态变量)和常量数据(如字符串常量),属于静态内存分配去。
③未初始化数据区(bss):通常称为BSS段,保存的是全局未初始化变量和未初始化静态变量,其值为空值或0。
(2)进程结构图:
在这里插入图片描述
从结构上来看,可以把一个进程分为5个部分:代码区、数据区、BSS区、堆区和栈区。
①代码区:用来存放进程执行的代码,这部分区域的大小在程序运行前就已经确定。
②数据区:用来存放已初始化的全局变量和静态变量,这部分区域的大小在程序运行前就可以确定。
③BSS区:用来存放未初始化的全局变量和静态变量,这部分区域的大小在程序运行前就可以确定。
以上三个区使用静态内存分配的方式,其内容来源于与进程对应的可执行程序,由加载器加载。
④堆区(heap):即进程运行过程中可被动态分配的内存段,大小不固定,可动态扩张或缩减。程序中可用malloc等函数动态分配的内存就属于堆区,不使用时需要调用free函数将该内存释放。
⑤栈区(stack):栈区内存由操作系统自动分配,用于存放进程中临时创建的局部变量、函数调用时的参数、返回值等,当函数调用结束时,由系统自动释放。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值