
Linux操作系统
文章平均质量分 92
系统学习Linux的各项操作
我要满血复活
厦门大学计算机科学与技术学生,简单记录学习路程
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Linux下基本指令
ls [选项][目录或文件:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。-a列出目录下的所有文件,包括以开头的隐含文件。-d将目录象文件一样显示,而不是显示其下的文件。如:ls –d指定目录-i输出文件的i节点的索引信息。如ls –ai指定文件-k以k字节的形式表示文件的大小。ls –alk指定文件-l列出文件的详细信息。-n用数字的UID,GID代替名称。(介绍UIDGID-F。原创 2024-06-10 16:29:18 · 1187 阅读 · 0 评论 -
Linux权限
目录的可执行权限是表示你可否在目录下执行命令。如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd进入目即使目录仍然有-r读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件),而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限,所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。原创 2024-06-19 19:18:14 · 1565 阅读 · 1 评论 -
Linux文本编辑器 - vim
如果想要退出保存,就需要进入底行模式,而当前的插入模式不能直接进入底行模式,要先按Esc键回到普通模式。当你左下角的INSERT消失了,就说明你退出插入模式了,如果想从普通模式进入底行模式,需要按下。接下来我们重点讲解vim的三种模式(其实有好多模式,目前掌握这3种即可),分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode)。该模式是vim的默认模式,在该模式下从键盘输入的字符被解释为命令而不是插入文本,这些命令。」键可回到命令行模式。原创 2024-06-23 22:23:56 · 1178 阅读 · 0 评论 -
Linux编译器 gcc/g++
GCC(英文全拼:GNU Compiler Collection)是 GNU 工具链的主要组成部分,是一套以 GPL 和 LGPL 许可证发布的程序语言编译器自由软件,由 Richard Stallman 于 1985 年开始开发。gcc是GCC中的C语言编译器,而g++是GCC中的C++编译器,使用g++同样可以编译C语言。编译C语言要经过预处理,编译,汇编,链接这四个过程。原创 2024-06-24 14:52:55 · 1258 阅读 · 0 评论 -
Linux调试器 gdb/cgdb
gbd基本概念GDB (GNU Debugger) 是一个强大的命令行调试工具,用于调试各种编程语言(如C、C++、Java、Python等)编写的程序。使用 gdb可以帮助开发人员更快地定位和修复程序中的缺陷,提高代码质量和开发效率。它是 Linux/Unix 系统上最常用的调试工具之一。程序的发布方式有两种,debug模式和release模式出来的二进制程序,默认是release模式,不可调试要使用gdb调试,必须在源代码生成二进制程序的时候加上g选项可以看到的是,原创 2024-06-24 16:35:05 · 557 阅读 · 0 评论 -
Linux项目自动化构建工具 make/Makefile
一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作.make是一个用于自动化编译和构建过程的工具。它主要用于管理大型软件项目的构建过程,帮助开发者更高效地编译和部署代码,并减少人为错误的发生,这使得软件的编译和部署变得更加自动化和可靠。原创 2024-06-26 08:35:21 · 890 阅读 · 0 评论 -
Linux上使用 git 命令行
点击下方的 create a new repository。需要进行邮箱校验.以下以创建Github为例。在创建好的项目页面中复制项目的链接。将代码放到刚才下载好的目录中。页面就能看到代码改动了.用户名密码. 同步成功后。原创 2024-06-26 12:34:32 · 320 阅读 · 0 评论 -
Linux进程概念
在操作系统中,管理任何对象,都可以转化成对某种数据结构的增删查改。1.描述起来,用struct结构体2.组织起来,用链表或其他高效的数据结构。原创 2024-06-27 23:13:07 · 1030 阅读 · 0 评论 -
Linux进程状态
我们把进程状态主要分为了三个状态。为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在Linux内核里,进程有时候也叫做任务)。Linux中,进程状态的本质其实就是一个整型变量,Linux通过管理进程的PCB结构体,来管理进程,而PCB内部就有一个整型变量来表示进程。下面的状态在kernel源代码里定义:/**/"R (running)", //0,在位图中即为00000000"S (sleeping)", //1,在位图中即为00000001。转载 2024-06-30 17:42:16 · 1073 阅读 · 0 评论 -
Linux环境变量
环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数。如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。在程序运行的过程中,可以定义变量,而Linux操作系统本身就是一个用C语言写的程序,因此操作系统可以在运行的过程中开辟空间。环境变量的本质,就是操作系统运行过程中,为自己开辟的空间,存储了一些重要的信息。原创 2024-07-01 22:34:09 · 1259 阅读 · 0 评论 -
Linux进程优先级
cpu资源分配的先后顺序,就是指进程的优先权(priority优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。在linux或者unix系统中,用ps –l命令则会类似输出以下几个内容:我们很容易注意到其中的几个重要信息,有下:UID :代表执行者的身份PID :代表这个进程的代号PPID。原创 2024-07-01 15:09:48 · 941 阅读 · 0 评论 -
Linux程序地址空间
命令行参数argv环境变量env局部变量动态内存管理全局变量静态数据可执行代码数据段堆区栈区这样一套体系,叫做进程地址空间,事实上,着些地址并不是真实物理地址,而是虚拟地址。原创 2024-07-05 08:10:29 · 923 阅读 · 0 评论 -
Linux进程等待
1. 子进程退出,父进程如果不管不顾,就可能造成僵尸进程的问题,进而造成内存泄漏。2. 另外,进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼的kill -9也无能为力,因为谁也没有办法杀死一个已经死去的进程。3. 最后,父进程派给子进程的任务完成的如何,我们需要知道。如,子进程运行完成,结果对还是不对,或者是否正常退出。父进程通过进程等待的方式,回收子进程资源,获取子进程退出信息。进程等待用于回收子进程的资源,避免子进程的PCB一直占用资源造成内存泄漏。原创 2024-07-08 19:19:42 · 1188 阅读 · 0 评论 -
Linux进程终止
1. 代码运行完毕,结果正确2. 代码运行完毕,结果不正确3. 代码异常终止。原创 2024-07-08 15:11:39 · 958 阅读 · 0 评论 -
Linux进程替换
另外的,函数声明中还有一小段备注/* (char *) NULL */,其意图告诉使用者:使用可变参数...时,必须以NULL空指针来结尾。系列的接口,将这些选项存储在一个数组中,然后把数组传入,不过注意该数组最后一个元素也要放NULL空指针。该接口的意思是:不用指明路径,只需指明替换的进程的名称,然后会自动去环境变量。指定的路径中查找,或者会自动在当前目录下查找。是系统自带的指令,所以不用指明路径,系统会自己去查找。就是用来指定以何种方式调用进程,或者说指定选项的,带有。从新程序的启动例程开始执行。原创 2024-07-17 19:58:54 · 1195 阅读 · 0 评论 -
Linux文件IO
fopen用于打开文件,包含在头文件<stdio.h>pathname:打开文件路径,可以是绝对路径或相对路径mode:打开文件的模式打开文件的最常用模式为:"r":只读,若文件不存在则报错"w":只写,若文件不存在则创建,打开时清空文件原有内容"a":只写,若文件不存在则创建,打开时从文件末尾追加该函数会返回一个FILE*的指针,C语言中,通过操作这个FILE*来控制文件的IO。当我们打开文件时,每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息。原创 2024-07-17 19:58:44 · 906 阅读 · 0 评论 -
Linux 用户缓冲区
我们知道Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入stdin--0, 标准输出stdout--1, 标准错误stderr--2。0,1,2对应的物理设备一般是:键盘,显示器,显示器.接下来我们来研究文件描述符的分配规则,代码如下。输出发现是 fd: 3 ,我们再关闭0或者2,在看看结果。发现是结果是: fd: 0 ,可见,文件描述符的分配规则:在files_struct数组当中,找到当前没有被使用的最小的一个下标,作为新的文件描述符。原创 2024-08-31 15:11:53 · 1309 阅读 · 0 评论 -
Linux 文件系统
我们使用ls -l的时候看到的除了看到文件名,还看到了文件元数据。每行包含7列内容,分别为 模式,硬链接数,文件所有者,组,大小,最后修改时间,文件名。ls -l读取存储在磁盘上的文件信息,然后显示出来。其实这个信息除了通过这种方式来读取,还有一个命令能够看到更多信息我们已经知道,文件=内容+属性。在Linux中,文件的内容和属性是分开管理的,因为文件的内容大小是不确定的,而每个文件的具有属性都是相同的,只是属性值不同。Linux把文件的属性放在结构体struct inode中管理。原创 2024-09-01 10:45:21 · 1049 阅读 · 0 评论 -
Linux 软硬连接
实际上并不是通过文件名来找到磁盘上的文件,而是通过inode。在linux中可以让多个文件名对应于同一个 inode,而这种方式就是建立硬链接。硬链接是文件系统中的一种链接类型,它创建了文件的一个额外的目录项,但不占用额外的磁盘空间。硬链接与原始文件共享相同的inode,这意味着它们指向文件系统中相同的数据。在Linux中,创建硬链接的命令是ln 源文件 硬链接名称,默认情况下不带任何选项时创建硬链接。示例如下:abc和def的链接状态完全相同,他们被称为指向文件的硬链接。原创 2024-09-01 13:42:57 · 1268 阅读 · 0 评论 -
Linux 动态库和静态库
我们在编程的过程中会调用很多库函数,比如C语言中的printf,scanf等等。那么C语言要如何拿到这个函数,并调用它呢?这就涉及到链接的过程。链接就是把可执行程序与众多库关联起来的过程,此时就可以调用外部的函数,使用外部的变量等等。在链接到库时,库分为两种:动态库和静态库。通过动态库实现的链接,叫做动态链接,通过静态库实现的链接叫做静态链接。我们可以先来简单了解一下二者的区别:静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。动态库(.so。原创 2024-09-03 07:57:22 · 1174 阅读 · 0 评论 -
Linux 管道
在Linux中,管道(pipe)是一种进程间通信机制,它允许将一个命令的输出直接作为另一个命令的输入。管道使用符号来连接命令,实现数据的流向。创建管道的系统调用是 pipe,其包含在头文件参数 int pipefd[2]是一个输出型参数,是一个长度为2的数组,其中 pipefd[0]是管道的读端fd,而pipefd[1]是管道的写端fd。管道的工作原理是在内核中创建一个缓冲区,用于存储一个命令的输出和另一个命令的输入。原创 2024-09-09 17:48:08 · 1842 阅读 · 0 评论 -
cgroups
Docker 及 k8s 中的 pod 就使用了 cgroups 提供的资源限制能力来完成 cpu,内存等部分的资源控制。比如在一个既部署了前端 web 服务,也部署了后端计算模块的八核服务器上,可以使用 cgroups 限制 web server 仅可以使用其中的六个核,把剩下的两个核留给后端计算模块。,通过程序运行时对资源的调度触发相应的钩子以达到资源追踪和限制的目的。:确保一个进程组不会消耗过多的系统资源,从而影响到其他进程组的正常运行。:为进程组设置不同的优先级,确保关键进程获得更多的资源。原创 2025-04-11 17:46:53 · 1046 阅读 · 0 评论 -
NameSpace 隔离
Namespace 隔离是一种用于实现系统资源隔离的技术,广泛应用于容器化环境和多租户场景中。Namespace 是 Linux 内核提供的一种资源隔离机制,允许将系统资源分隔成多个虚拟的“空间”,每个命名空间内的进程只能访问该命名空间下的资源,而不能访问其他命名空间中的资源。通过 Namespace,不同的进程可以在同一个操作系统内共享硬件资源,但又能感知到各自独立的环境。:隔离文件系统的挂载点,确保每个容器拥有独立的文件系统视图。:隔离主机名和域名,每个容器可以拥有独立的主机名。原创 2025-04-11 12:48:34 · 676 阅读 · 0 评论 -
Linux 中System V IPC的共享内存
System V IPC(Inter-Process Communication)是一组在UNIX系统中用于进程间通信的机制,包括共享内存、消息队列和信号量。这些机制由System V内核提供,并且它们的存在不依赖于创建它们的进程,而是由内核管理,直到显式删除。由于消息队列和信号量并不常用,故而以下主要介绍共享内存。原创 2024-09-13 23:44:02 · 1134 阅读 · 0 评论 -
Linux System V - 消息队列与责任链模式
消息队列是一种以消息为单位的进程间通信机制,允许一个或多个进程向队列中发送消息,同时允许一个或多个进程从队列中接收消息。:发送方和接收方不需要同时运行,消息会存储在队列中。:支持消息的优先级排序。:每条消息都有一个类型,可以根据类型选择性地接收。:即使发送方或接收方意外退出,消息仍然保留在队列中。内核结构在其中是 System V IPC(进程间通信)机制中用于描述 IPC 对象(如消息队列、信号量集或共享内存段)权限和所有者信息的数据结构。原创 2025-02-21 00:16:44 · 1109 阅读 · 0 评论 -
Linux 信号的产生
在Linux系统中,信号是一种进程间通信的机制,它允许操作系统或其他进程向特定进程发送异步通知。我们可以通过命令kill -l来查看信号的种类:Linux系统中的信号可以分为两大类:传统信号和实时信号。[1, 31]和[34, 64],无32和33号信号,[1, 31]区间为传统信号共有31种,当进程收到传统信号后,可以自己选择合适的时候处理;[34, 64]为实时信号共有31种,当进程收到实时信号后,立马处理。原创 2024-09-19 23:33:48 · 1361 阅读 · 0 评论 -
Linux 信号保存
在Linux系统中,信号的保存主要涉及到信号的递达、阻塞和未决状态。当信号产生时,进程不一定会立即处理它,而是可能在合适的时机进行处理。在信号递达之前,进程需要在内核中保存信号的状态,以便后续处理。Linux操作系统通过进程的内核数据结构来实现信号的保存。当信号产生时,即使进程当前不处理信号,内核也会在pending表中标记该信号为未决状态,即pending表中的对应位会被设置为1。当进程从内核态返回用户态时,会检查pending表,并发送未决信号进行处理。原创 2024-09-27 12:01:09 · 710 阅读 · 0 评论 -
Linux 信号捕捉
我们知道信号的处理不是即时的,进程在合适的时机才会处理信号,而这个时机就比如从内核态返回用户态。原创 2024-09-29 23:22:40 · 823 阅读 · 0 评论 -
Linux 线程概念及线程控制
执行流(Execution Flow)通常指的是程序执行过程中的控制路径,它描述了程序从开始到结束的指令执行顺序。例如我们要有两个执行流来分别进行加法和减法的运算,我们可以通过使用 fork 函数来创建子进程,父进程进行加法运算,子进程进行减法的运算来完成任务,但是创建一个进程需要额外创建PCB,进程地址空间,页表等等,代价过大效率过低,于是出现了线程的概念。在Linux系统中,线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中。每个线程都有自己的运行状态,包括程序计数器、寄存器集和栈。原创 2024-10-14 15:33:26 · 1251 阅读 · 0 评论 -
Linux 线程互斥
相关背景概念。原创 2024-10-19 22:00:24 · 768 阅读 · 0 评论 -
Linux 线程同步
例如上诉的抢票系统中,我们有5个线程来共享临界资源 g_tickets,为了保证临界资源的原子性,我们对其采用了锁。执行之后出现如下情况:我们发现都是一个线程抢到票,即都是同一个线程占用了锁,这是因为线程在占用锁的时候,是不受控制的,这就有可能导致一个竞争能力强的线程,从头到尾都占用一个锁。为了总是避免一个线程占用锁,于是出现了线程同步的概念。在Linux中,线程同步是指多个线程在执行过程中,通过一些机制来协调它们对数据和资源的访问,让线程能够按照某种特定的顺序访问临界资源,原创 2024-10-20 15:00:53 · 701 阅读 · 0 评论 -
Linux 生产者消费者模型
假设现在有多个线程,一部分线程负责生产任务,称为生产者productor,另一部线程负责执行任务,称为消费者consumer,他们之间是一对一的关系。现在生产者有任务要派发,但是consumer-3正在执行上一个任务,于是就只能等待。但是此时明明有两个线程consumer-1和consumer-2是空闲的,它们却不能执行这个任务,这就出现了很明显的资源分配不合理问题。原创 2024-10-28 22:28:08 · 1303 阅读 · 0 评论 -
Linux 线程池
线程池是一种多线程处理形式,它维护着多个线程,这些线程处于等待状态,随时准备接受任务并执行。线程池的主要目的是为了提高系统的性能和资源利用率,避免在处理短时间任务时频繁创建和销毁线程所带来的开销。线程池的应用场景需要大量的线程来完成任务,且完成任务的时间比较短。WEB服务器完成网页请求这样的任务,使用线程池技术是非常合适的。因为单个任务小,而任务数量巨大,你可以想象一个热门网站的点击次数。但对于长时间的任务,比如一个Telnet连接请求,线程池的优点就不明显了。因为Telnet。原创 2024-12-25 16:36:34 · 914 阅读 · 0 评论