操作系统基础知识

目录

简介

用户态和内核态

  用户态切换内核态

进程和线程

  进程的状态

  进程的通信

  进程调度算法

  多线程

  线程同步的方法

死锁

  死锁的四个必要条件

  避免死锁

内存

  内存的功能

  内存碎片

  内存管理

    虚拟内存

    虚拟地址和物理地址

      虚拟地址转换

        分页机制

        分页机制和分段机制

        段页机制

Linux

  Linux 常用命令

    用户管理

    系统状态

    网络通信

    其他

  文件系统

    inode

    硬链接和软链接

    文件类型

    文件权限

Shell

变量

基本语法

日志切割


简介

  操作系统本质上是一个运行在计算机上的软件程序 ,主要用于管理计算机硬件和软件资源。操作系统完成了对进程和线程的管理、存储管理、设备管理等

用户态和内核态

  1. 用户态: 用户态运行的进程可以直接读取用户程序的数据,拥有较低的权限。当应用程序需要执行某些需要特殊权限的操作,如读写磁盘、网络通信等,需要向操作系统发起系统调用请求进入内核态。

  2. 内核态:内核态运行的进程几乎可以访问计算机的任何资源包括系统的内存空间、设备、驱动程序等,拥有非常高的权限。当操作系统接收到进程的系统调用请求时,就会从用户态切换到内核态,执行相应的系统调用,最后再从内核态切换回用户态。

  用户态切换内核态

    系统调用:用户态进程主动切换到内核态的一种方式,为了使用内核态才能做的事比如读取磁盘资源进行设备、文件管理。其核心还是依靠中断来实现。

    中断:当外围设备完成用户请求的操作后,会向 CPU 发出相应的中断信号,这时 CPU 会暂停执行下一条指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。

    异常:当 CPU 在执行运行在用户态下的程序时,发生了事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。

进程和线程

  • 进程:是指计算机中程序的一次执行,进程直接互相独立,一个进程中包含多个线程。

  • 线程:也被称为轻量级进程,多个线程可以在同一个进程中同时执行,并且共享进程的资源比如内存空间、网络连接等,之间通信无须调用内核。比起进程,多个线程可并发处理不同任务。

  进程的状态

  • 创建状态:进程正在被创建,尚未到就绪状态。

  • 就绪状态:进程已处于准备运行状态,即进程获得了除了处理器之外的一切所需资源,一旦得到处理器资源(时间片)即可运行。

  • 运行状态:进程正在处理器上运行(单核 CPU 下任意时刻只有一个进程处于运行状态)。

  • 阻塞状态:又称为等待状态,进程正在等待某一事件而暂停运行如等待某资源为可用或等待 IO 操作完成。即使处理器空闲,该进程也不能运行。

  • 结束状态:进程正在从系统中消失,可能是进程正常结束或其他原因中断退出运行。

  进程的通信

  • 管道/匿名管道:用于具有亲缘关系的父子进程间或者兄弟进程之间的通信,只存在于内存中的文件,

  • 有名管道 : 匿名管道由于没有名字,只能用于亲缘关系的进程间通信。为了克服这个缺点,提出了有名管道。有名管道严格遵循 先进先出。有名管道以磁盘文件的方式存在,可以实现本机任意两个进程通信。

  • 信号:信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

  • 消息队列:消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识。管道和消息队列的通信数据都是先进先出的原则。与管道不同的是消息队列存放在内核中,只有在内核重启或者显式地删除一个消息队列时,该消息队列才会被真正的删除。消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取,比 FIFO 更有优势。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。

  • 信号量:信号量是一个计数器,用于多进程对共享数据的访问,这种通信方式主要用于解决与同步相关的问题并避免竞争条件。

  • 共享内存:使多个进程可访问同一块内存空间,不同进程可及时看到对方进程中对共享内存中数据的更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。可以说是最有用的进程间通信方式。

  • 套接字 : 此方法主要用于在客户端和服务器之间通过网络进行通信。套接字是支持 TCP/IP 的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。

  进程调度算法

  • 先到先服务调度算法(FCFS) : 从就绪队列中选择一个最先进入该队列的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再重新调度。

  • 短作业优先的调度算法(SJF) : 从就绪队列中选出一个估计运行时间最短的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再重新调度。

  • 时间片轮转调度算法(RR) : 时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。

  • 多级反馈队列调度算法(MFQ):短作业优先调度算法,仅照顾了短进程而忽略了长进程 。多级反馈队列调度算法既能使高优先级的作业得到响应又能使短进程迅速完成。因而是目前被公认的一种较好的进程调度算法,UNIX 操作系统采取的便是这种调度算法。

  • 优先级调度算法(Priority):为每个流程分配优先级,首先执行具有最高优先级的进程。具有相同优先级的进程以 FCFS 方式执行,可以根据内存要求,时间要求或其他资源要求来确定优先级。

  多线程

  • 意义:线程是程序执行的最小单位,切换和调度的成本远远小于进程。多核 CPU 时代意味着多个线程可以同时运行,这减少了线程上下文切换的开销,多线程并发编程正是开发高并发系统的基础。

  线程同步的方法

  • 互斥锁:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。比如 Java 中的 synchronized 关键词和各种 Lock 都是这种机制。

  • 读写锁:允许多个线程同时读取共享资源,但只有一个线程可以对共享资源进行写操作。

  • 信号量:允许多个线程同时访问同一资源,但需要控制同一时刻访问此资源的最大线程数量。

  • 屏障:屏障是一种同步原语,用于等待多个线程到达某个点再一起继续执行。当一个线程到达屏障时,它会停止执行并等待其他线程到达屏障,直到所有线程都到达屏障后,它们才会一起继续执行。比如 Java 中的 CyclicBarrier 是这种机制。

  • 事件 :Wait/Notify:通过通知操作的方式来保持多线程同步,还可以实现多线程优先级的比较操作。

死锁

  多个进程/线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放,导致被进程/线程被无限期地阻塞

  死锁的四个必要条件

  • 互斥:资源必须处于非共享模式,即一次只有一个进程可以使用。如果另一进程申请该资源,那么必须等待直到该资源被释放为止。

  • 占有并等待:一个进程至少应该占有一个资源,并其他进程释放等待另一资源。

  • 非抢占:资源不能被抢占,只能在持有资源的进程完成任务后,该资源才会被释放。

  • 循环等待:有一组等待进程 {P0, P1,..., Pn}, P0 等待的资源被 P1 占有,P1 等待的资源被 P2 占有,……,Pn-1 等待的资源被 Pn 占有,Pn 等待的资源被 P0 占有。

  避免死锁

内存

  内存的功能

  • 内存的分配与回收:对进程所需的内存进行分配和释放,malloc :申请内存,free :释放内存。

  • 地址转换:将程序中的虚拟地址转换成内存中的物理地址。

  • 内存扩充:当系统没有足够的内存时,利用虚拟内存技术或自动覆盖技术,从逻辑上扩充内存。

  • 内存映射:将一个文件直接映射到进程的空间中,这样可通过内存指针用读写内存的办法直接存取文件内容,速度更快。

  • 内存优化:通过调整内存分配策略和回收算法来优化内存使用效率。

  • 内存安全:保证进程之间使用内存互不干扰,避免一些恶意程序通过修改内存来破坏系统安全性。

  内存碎片

  • 内部内存碎片:已分配给进程但未被使用的内存。导致内部内存碎片的主要原因是,当采用固定比例比如 2 的幂次方进行内存分配时,进程所分配的内存可能会比其实际所需要的大。例如一个进程只需要 65 字节的内存,但为其分配了 128(2^7) 大小的内存,那 63 字节的内存就成为了内部内存碎片。

  • 外部内存碎片:由于未分配的连续内存区域太小,不能满足任意进程所需要的内存分配请求,这些小片段且不连续的内存空间被称为外部碎片。也就是说,外部内存碎片指的是那些并未分配给进程但又不能使用的内存。

  内存管理

  • 连续内存管理 为一个程序分配连续的内存空间,内存利用率不高,容易产生内存碎片。

    • 块式管理 :将内存分为固定大小的块,每个块中只包含一个进程。如果程序运行需要内存,操作系统就分配给它一块,如果程序只需要很小的空间,分配的内存很大部分被浪费了。

    • 伙伴系统算法:将内存按 2 的幂次划分,并将相邻的内存块组合成一对伙伴。当进行内存分配时,会尝试找到大小最合适的内存块,如果找到的内存块过大,就分成两个大小相等的伙伴块。如果还大就继续切分,直到到达合适的大小为止。假设两块相邻的内存块都被释放,系统会将这两个内存块合并,以便后续的内存分配。可以减少内存碎片的问题,但仍然存在内存利用率不高的问题。

  • 非连续内存管理 允许一个程序使用的内存分布在离散或不相邻的内存中,相对更加灵活。

    • 段式管理:以段(一段连续的物理内存)的形式分配物理内存。应用程序的虚拟地址空间被分为大小不等的段,段是有实际意义的,每个段定义了一组逻辑信息,例如有主程序段 MAIN、子程序段 X、数据段 D 及栈段 S 等。

    • 页式管理:把物理内存分为连续等长的物理页,应用程序的虚拟地址空间也被划分为连续等长的虚拟页,是现代操作系统广泛使用的一种内存管理方式。

    • 段页式管理机制:结合了段式管理和页式管理的一种内存管理机制,把物理内存先分成若干段,每个段又继续分成若干大小相等的页。

    虚拟内存

  • 虚拟内存是假想出来的内存空间,作用是作为进程访问物理内存的桥梁并简化内存管理。

  • 隔离进程:物理内存通过虚拟地址空间访问,虚拟地址空间与进程一一对应。每个进程都认为自己拥有了整个物理内存,进程之间彼此隔离,一个进程中的代码无法更改正在由另一进程或操作系统使用的物理内存。

  • 提升物理内存利用率:有了虚拟地址空间后,操作系统只需要将进程当前正在使用的部分数据或指令加载入物理内存。

  • 简化内存管理:进程都有一个一致且私有的虚拟地址空间,程序员不用和真正的物理内存打交道,而是借助虚拟地址空间访问物理内存,从而简化了内存管理。

  • 多个进程共享物理内存:进程在运行过程中,会加载许多操作系统的动态库。这些库对于每个进程而言都是公用的,它们在内存中实际只会加载一份,这部分称为共享内存。

  • 提高内存使用安全性:控制进程对物理内存的访问,隔离不同进程的访问权限,提高系统的安全性。

  • 提供更大的可使用内存空间:可以让程序拥有超过系统物理内存大小的可用内存空间。这是因为当物理内存不够用时,可以利用磁盘充当,将物理内存页保存到磁盘文件,数据或代码页会根据需要在物理内存与磁盘之间移动。

    虚拟地址和物理地址

  • 简介:物理地址是真正的物理内存中地址,更具体点来说是内存地址寄存器中的地址,程序中访问的内存地址不是物理地址,而是虚拟地址 。操作系统一般通过 CPU中的一个重要组件 MMU(内存管理单元) 将虚拟地址转换为物理地址,这个过程被称为地址翻译/地址转换。

      虚拟地址转换
  • MMU 将虚拟地址翻译为物理地址的主要机制有 3 种:分段机制、分页机制、段页机制

  • 分段机制

    • 段表:包括段号和段内偏移量

    • 流程:MMU 首先解析得到虚拟地址中的段号,通过段号去该应用程序的段表中取出对应的段信息(找到对应的段表项),从段信息中取出该段的起始地址(物理地址)加上虚拟地址中的段内偏移量得到最终的物理地址。

    • 缺陷:分段机制容易出现外部内存碎片,在段与段之间留下碎片空间(不足以映射给虚拟地址空间中的段),从而造成物理内存资源利用率的降低。

        分页机制
  • 页表:包括页号和页内偏移量

  • 流程:MMU 首先解析得到虚拟地址中的虚拟页号,通过虚拟页号去该应用程序的页表中取出对应的物理页号(找到对应的页表项),用该物理页号对应的物理页起始地址(物理地址)加上虚拟地址中的页内偏移量得到最终的物理地址。

  • 描述:在分页机制下,应用程序虚拟地址空间中的任意虚拟页可以被映射到物理内存中的任意物理页上,因此可以实现物理内存资源的离散分配。分页机制按照固定页大小分配物理内存,使得物理内存资源易于管理,可有效避免分段机制中外部内存碎片的问题。

  • 多级页表:

  • 页缺失

    • 硬性页缺失:物理内存中没有对应的物理页。Page Fault Handler 会指示 CPU 从已经打开的磁盘文件中读取相应的内容到物理内存,而后交由 MMU 建立相应的虚拟页和物理页的映射关系。

    • 软性页缺失:物理内存中有对应的物理页,但虚拟页还未和物理页建立映射。Page Fault Handler 会指示 MMU 建立相应的虚拟页和物理页的映射关系。

    • 无效缺页错误:应用程序访问的是无效的物理内存。

  • 页面置换算法

    • 最佳页面置换算法(OPT,Optimal):优先选择淘汰的页面是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。但由于人们目前无法预知进程在内存下的若干页面中哪个是未来最长时间内不再被访问的,因而该算法无法实现,只是理论最优的页面置换算法,可以作为衡量其他置换算法优劣的标准。

    • 先进先出页面置换算法(FIFO,First In First Out) : 最简单的一种页面置换算法,总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面进行淘汰。该算法易于实现和理解,一般只需要通过一个 FIFO 队列即可需求。不过,它的性能并不是很好。

    • 最近最久未使用页面置换算法(LRU ,Least Recently Used):LRU 算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 T,当须淘汰一个页面时,选择现有页面中其 T 值最大的,即最近最久未使用的页面予以淘汰。LRU 算法是根据各页之前的访问情况来实现,因此是易于实现的。OPT 算法是根据各页未来的访问情况来实现,因此是不可实现的。

    • 最少使用页面置换算法(LFU,Least Frequently Used) : 和 LRU 算法比较像,不过该置换算法选择的是之前一段时间内使用最少的页面作为淘汰页。

    • 时钟页面置换算法(Clock):可以认为是一种最近未使用算法,即逐出的页面都是最近没有使用的那个。

        分页机制和分段机制
  • 都是非连续内存管理的方式,都采用了地址映射的方法,将虚拟地址映射到物理地址,以实现对内存的管理和保护。

  • 分页机制以页面为单位进行内存管理,而分段机制以段为单位进行内存管理。页的大小是固定的,由操作系统决定,通常为 2 的幂次方。而段的大小不固定,取决于当前运行的程序。

  • 页是物理单位,即操作系统将物理内存划分成固定大小的页面,每个页面的大小通常是 2 的幂次方,例如 4KB、8KB 等等。而段则是逻辑单位,是为了满足程序对内存空间的逻辑需求而设计的,通常根据程序中数据和代码的逻辑结构来划分。

  • 分段机制容易出现外部内存碎片,即在段与段之间留下碎片空间(不足以映射给虚拟地址空间中的段)。分页机制解决了外部内存碎片的问题,但仍然可能会出现内部内存碎片。

  • 分页机制采用了页表来完成虚拟地址到物理地址的映射,页表通过一级页表和二级页表来实现多级映射;而分段机制采用了段表来完成虚拟地址到物理地址的映射,段表项中记录段的起始地址和长度。

  • 分页机制对程序没有任何要求,程序只需要按照虚拟地址进行访问即可;而分段机制需要程序员将程序分为多个段,并且显式地使用段寄存器来访问不同的段。

        段页机制

           把物理内存先分成若干段,每个段又继续分成若干大小相等的页。

Linux

  Linux 常用命令

  • find [路径] [表达式]:在指定目录及其子目录中搜索文件或目录。在/home目录下查找以 .txt 结尾的文件名:find /home -name "*.txt" 。

  • touch 文件名:创建新文件或更新已存在文件。

  • cat/more/less/tail 文件名:文件的查看 。命令 tail -f 文件 可以对某个文件进行动态监控,例如 Tomcat 的日志文件。

  • vim 文件名:修改文件的内容。输入 wq 代表保存内容并退出;输入 q!代表强制退出不保存。

  • tar: -zcvf为打包并压缩文件,-xvf为解压压缩包。

  • scp 源文件 远程文件:通过 SSH 协议进行安全的文件传输,可以实现从本地到远程主机的上传和从下载。例如:scp -r my_directory user@remote:/home/user ,将本地目录my_directory上传到远程服务器 /home/user 目录下。scp -r user@remote:/home/user/my_directory ,将远程服务器的 /home/user 目录下的my_directory目录下载到本地。注意,scp 命令需要在本地和远程系统之间建立 SSH 连接进行文件传输,因此需要确保远程服务器已经配置了 SSH 服务,并且具有正确的权限和认证方式。

  • chmod:修改文件/目录的权限。chmod u=rwx,g=rw,o=r aaa.txt 或者 chmod 764 aaa.txt

    用户管理
  • useradd 用户名:创建用户账号。使用useradd指令所建立的帐号,实际上是保存在 /etc/passwd文本文件中。

  • userdel 用户名:删除用户帐号。

  • usermod 用户名:修改用户账号的属性和配置比如用户名、用户 ID、家目录。

  • passwd 用户名:设置用户的认证信息,包括用户密码、密码过期时间等。。例如:passwd -S 用户名 ,显示用户账号密码信息。passwd -d 用户名: 清除用户密码,会导致用户无法登录。passwd 用户名,修改用户密码,随后系统会提示输入新密码并确认密码。

  • su 用户名(Switch User):在当前登录的用户和其他用户之间切换身份。

  • groupadd 用户组 :增加一个新的用户组。

  • groupdel 用户组:要删除一个已有的用户组。

  • groupmod 用户组 : 修改用户组的属性。

    系统状态
  • top :用于实时查看系统的 CPU 使用率、内存使用率、进程信息等。

  • htop :类似于 top,但提供了更加交互式和友好的界面,可让用户交互式操作,支持颜色主题,可横向或纵向滚动浏览进程列表,并支持鼠标操作。

  • uptime :用于查看系统总共运行了多长时间、系统的平均负载等信息。

  • vmstat [间隔时间] [重复次数]:vmstat (Virtual Memory Statistics) 的含义为显示虚拟内存状态,但是它可以报告关于进程、内存、I/O 等系统整体运行状态。

  • free :用于查看系统的内存使用情况,包括已用内存、可用内存、缓冲区和缓存等。

  • df [文件系统]:用于查看系统的磁盘空间使用情况,包括磁盘空间的总量、已使用量和可用量等,可以指定文件系统上。例如:df -a,查看全部文件系统。

  • du[文件]:用于查看指定目录或文件的磁盘空间使用情况,可以指定不同的选项来控制输出格式和单位。

  • sar [时间间隔] [重复次数]:用于收集、报告和分析系统的性能统计信息,包括系统的 CPU 使用、内存使用、磁盘 I/O、网络活动等详细信息。它的特点是可以连续对系统取样,获得大量的取样数据。取样数据和分析的结果都可以存入文件,使用它时消耗的系统资源很小。

  • ps :用于查看系统中的进程信息,包括进程的 ID、状态、资源使用情况等。ps -ef/ps -aux:这两个命令都是查看当前系统正在运行进程,两者的区别是展示格式不同。如果想查看特定的进程可以使用这样的格式:ps aux|grep redis (查看包括 redis 字符串的进程),也可使用 pgrep redis -a。

  • systemctl [命令] [服务名称]:用于管理系统的服务和单元,可以查看系统服务的状态、启动、停止、重启等。

    网络通信
  • ping 目标主机:测试与目标主机的网络连接。

  • ifconfig 或 ip:用于查看系统的网络接口信息,包括网络接口的 IP 地址、MAC 地址、状态等。

  • netstat :用于查看系统的网络连接状态和网络统计信息,可以查看当前的网络连接情况、监听端口、网络协议等。

  • ss :比 netstat 更好用,提供了更快速、更详细的网络连接信息。

    其他
  • sudo + 其他命令:以系统管理者的身份执行指令,也就是说,经由 sudo 所执行的指令就好像是 root 亲自执行。

  • grep 要搜索的字符串 要搜索的文件 --color:搜索命令,--color 代表高亮显示。

  • kill -9 进程的pid:杀死进程(-9 表示强制终止)先用 ps 查找进程,然后用 kill 杀掉。

  • shutdown:shutdown -h now:指定现在立即关机;shutdown +5 "System will shutdown after 5 minutes":指定 5 分钟后关机,同时送出警告信息给登入用户。

  • reboot:reboot:重开机。reboot -w:做个重开机的模拟(只有纪录并不会真的重开机)。

  文件系统

  • 简介:在 Linux 中,一切被操作系统管理的资源,如网络接口卡、磁盘驱动器、打印机、输入输出设备、普通文件或目录等都被视为文件。使得 Linux 系统可通过统一的文件接口来管理和操作不同类型的资源,例如可以使用读写文件的方式来对待网络接口、设备文件等,使得操作和管理更加统一简便。

    inode

      记录文件的属性信息,可以使用 stat 命令查看 inode 信息。

  • 硬盘的最小存储单位是扇区(Sector),块(block)由多个扇区组成。文件数据存储在块中,块最常见大小是 4kb,约为 8 个连续的扇区组成(每个扇区存储 512 字节)。一个文件可能会占用多个 block,一个块只能存放一个文件。还需要一个空间来存储文件的元信息 metadata:如文件被分成几块、每一块的地址、文件拥有者,创建时间,权限,大小等。这种 存储文件元信息的区域就叫 inode,索引节点(index+node),每个文件都有一个唯一的 inode,存储文件的元信息。

  • inode 是固定大小的数据结构,其大小在创建时就确定了,并且在文件的生命周期内保持不变。

  • inode 访问速度非常快,系统可以通过 inode 号定位到文件的元数据信息,无需遍历文件系统。

  • inode 的数量是有限的,每个文件系统只能包含固定数量的 inode。这意味着当文件系统中的 inode 用完时,无法再创建新的文件或目录,即使磁盘上还有可用空间。因此在创建文件系统时,需要根据文件和目录的预期数量来合理分配 inode 的数量。

  • 可以使用 stat 命令可以查看文件的 inode 信息,包括文件的 inode 号、文件类型、权限、所有者、文件大小、修改时间。

    硬链接和软链接
  • 硬链接(Hard Link)

    • 在 Linux系统中,每个文件和目录都有唯一的索引节点(inode)号来标识该文件或目录。硬链接通过 inode 节点号建立连接,硬链接和源文件的 inode 节点号相同,两者对文件系统来说是完全平等的(可以看作是互为硬链接,源头是同一份文件),删除其中任何一个对另外一个没有影响,可以通过给文件设置硬链接文件来防止重要文件被误删。

    • 只有删除了源文件和所有对应的硬链接文件,该文件才会被真正删除。

    • 硬链接具有一些限制,不能对目录以及不存在的文件创建硬链接,硬链接也不能跨越文件系统。

    • ln 命令用于创建硬链接。

  • 软链接(Symbolic Link 或 Symlink)

    • 软链接和源文件的 inode 节点号不同,而是指向一个文件路径。

    • 源文件删除后,软链接依然存在,但是指向的是一个无效的文件路径。

    • 软连接类似于 Windows 系统中的快捷方式。

    • 不同于硬链接,可以对目录或者不存在的文件创建软链接,并且软链接可以跨越文件系统。

    • ln -s 命令用于创建软链接。

    文件类型
  • 普通文件(-):用于存储信息和数据, Linux 用户可以根据访问权限对普通文件进行查看、更改和删除。比如:图片、声音、PDF、text、视频、源代码等等。

  • 目录文件(d,directory file):目录也是文件的一种,用于表示和管理系统中的文件,目录文件中包含一些文件名和子目录名,打开目录事实上就是打开目录文件。

  • 符号链接文件(l,symbolic link):保留了指向文件的地址而不是文件本身。

  • 字符设备(c,char):用来访问字符设备比如键盘。

  • 设备文件(b,block):用来访问块设备比如硬盘、软盘。

  • 管道文件(p,pipe) : 一种特殊类型的文件,用于进程之间的通信。

  • 套接字文件(s,socket):用于进程间的网络通信,也可以用于本机之间的非网络通信。

    文件权限
  • r:代表权限是可读,可以用数字 4 表示

  • w:代表权限是可写,可以用数字 2 表示

  • x:代表权限是可执行,可以用数字 1 表示(可以将文件其运行为二进制文件)

Shell

Shell 编程就是对 Linux 命令的逻辑化处理,运行采用./helloworld.sh

变量

PATH 决定了 shell 将到哪些目录中寻找命令或程序

HOME 当前用户主目录

HISTSIZE  历史记录数

LOGNAME 当前用户的登录名

HOSTNAME  指主机的名称

SHELL 当前用户 Shell 类型

LANGUAGE  语言相关的环境变量,多语言可以修改此环境变量

基本语法

#!/bin/bash
#自定义变量hello
hello="hello world"
echo $hello
echo  "helloworld!"

# 数组
array=(1 2 3 4 5);
length=${#array[@]}
echo $length #输出数组长度
echo ${array[2]} #输出数组第三个元素
unset array[1]# 删除下标为1的元素也就是删除第二个元素
unset array; # 删除数组中的所有元素
for i in ${array[@]};do echo $i ;done # 遍历数组,输出:1 3 4 5

#加法
a=3;b=3;
val=`expr $a + $b`
echo "Total value : $val"#输出:Total value : 6

#流程控制
#!/bin/bash
a=3;b=9;
if [ $a -eq $b ]
then
   echo "a 等于 b"
elif [ $a -gt $b ]
then
   echo "a 大于 b"
else
   echo "a 小于 b"
fi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值