Linux 开发工具(上)Linux 编辑器 —— vimVim 是一个强大、多模式的文本编辑器,具有高度的可定制性和丰富的功能。打开文件:在命令行中输入 vim filename,打开指定文件。Vim 从入门到牛逼 / Vim 从入门到牛逼(备用)
打开当前目录下的文件 code.c,使用命令:vim code.c,同时 支持相对路径和绝对路径 打开:vim home/code.c。
Vim 的主要模式:
命令模式(Normal Mode):命令模式是 Vim 的核心模式,几乎所有操作都从这里开始,启动 Vim 后,默认处于命令模式。在此模式下,键盘输入被解释为命令而非文本输入。只能使用方向键、删除、复制、粘贴等操作用来进行文本的导航、选择、删除、替换等。(按 i 进入插入模式,按 : 进入底行模式,按 Esc 从其他模式返回到命令模式)
插入模式(Insert Mode):按下 i 键进入插入模式。插入模式下可以像普通文本编辑器一样输入文本。按 Esc 键返回命令模式。
底行模式(Ex Mode 或 Bottom Line Mode):底行模式是 Vim 的强大功能之一, ...
Linux
未读Linux 软件包管理器 yum在 Linux 中,安装软件的常见方式主要有三种:源代码安装、rpm 安装和 yum 安装。它们各自有优缺点,适用于不同的场景。
安装方式
优点
缺点
源代码安装
- 高度定制化(调整编译选项、安装路径等)
- 操作复杂,需要手动执行 ./configure, make, make install 等步骤
- 软件版本灵活(能获取最新版本或特定版本)
- 依赖管理困难,需手动解决依赖关系
- 跨平台兼容性强(适配不同架构或操作系统)
- 编译过程时间长,消耗大量计算资源
- 升级和卸载困难,缺乏统一的版本管理
rpm 安装
- 安装速度快,使用预编译的二进制包
- 依赖需手动解决,可能出现“依赖地狱”
- 安装时自动检查并提示缺少的依赖项
- 版本受限于本地或下载的 RPM 包,可能无法获取最新版本
- 通过 rpm 命令可管理软件包(查询、验证、升级、卸载等)
- 默认不关联远程仓库,依赖本地或手动下载的 RPM 包
yum 安装
- 自动解决依赖关系,简化安装过程
- 需要联网访问仓库(离线环境需配 ...
shell 命令以及运行原理1. Shell 是什么?Shell 是用户与操作系统内核(Kernel)之间的“翻译官”。
你可以把操作系统内核想象成一个国家的总统(Kernel),他直接管理国家资源(CPU、内存、磁盘等)。但普通人(用户)无法直接和总统对话,必须通过一个“秘书”(Shell)来传达需求。
用户通过 Shell 输入命令(比如 ls、cd)。
Shell 将命令“翻译”成内核能理解的指令,交给内核执行。
内核处理完成后,结果再通过 Shell 返回给用户。
2. 为什么不能直接操作内核?
内核是操作系统的核心,直接操作风险极高。比如,直接让内核删除某个文件,就像让总统亲自去处理一个普通任务——虽然高效但风险极高,一旦出错可能导致系统崩溃。
Shell 的存在是为了安全和易用:
用户无需理解底层硬件细节(比如如何读写磁盘)。
Shell 通过权限控制和语法检查,避免用户误操作导致系统崩溃。
3. Shell 的“媒婆”比喻Shell 是“媒婆”,内核是“村花小花”:你想追求小花(让内核干活),但不好意思直接开口(直接操作内核)。于是你找 ...
Linux
未读写在最前一、Linux 指令的本质与执行逻辑
指令与可执行程序的关系
指令即程序:用户输入的指令(如 ls、cp)本质是 可执行程序或脚本,以文件形式存储在系统路径中(如 /bin、/usr/bin)。
位置依赖:指令执行前需在系统预设路径(由 $PATH 环境变量定义)中查找对应文件。若未找到,提示 command not found。
指令执行流程
查找与验证:系统按 $PATH 路径顺序搜索可执行文件,并检查文件权限(需具备可执行权限)。
执行过程:找到文件后,操作系统加载程序至内存运行,用户通过命令行解释器间接与内核交互。
二、核心设计哲学:Linux 下一切皆文件
抽象统一性
硬件设备抽象为文件:
显示器:通过 fwrite 写入数据(如 echo "Hello" > /dev/tty)。
键盘:通过 fread 读取输入(如 cat /dev/input/eventX)。
统一操作接口:无论是硬件设备(如显示器、键盘)还是普通的文件,都可以通过文件操作进行读 read()、写 write() 等系统调用,简化编程与设 ...
C++ 模板概述在 C++ 中,模板(Template)是一个非常强大的特性,它可以让我们编写与特定数据类型无关的代码,最终由编译器根据实际的类型生成特定的代码。模板主要分为两类:函数模板 和 类模板。模板的引入大大增强了 C++ 语言的灵活性和代码复用性,减少了重复代码的编写。
1. 为什么需要模板?假设你想编写一个通用的函数来交换两个变量的值。最初,你可能会想到通过函数重载来实现,例如:
123456789101112131415161718192021void Swap(int& left, int& right){ int temp = left; left = right; right = temp;}void Swap(double& left, double& right){ double temp = left; left = right; right = temp;}void Swap(char& left, char& right){ ...
C/C++内存管理C/C++内存分布问题引入:
1234567891011121314151617181920212223242526272829int globalVar = 1;static int staticGlobalVar = 1;void Test(){ static int staticVar = 1; int localVar = 1; int num1[10] = { 1, 2, 3, 4 }; char char2[] = "abcd"; const char* pChar3 = "abcd"; int* ptr1 = (int*)malloc(sizeof(int) * 4); int* ptr2 = (int*)calloc(4, sizeof(int)); int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4); free(ptr1); free(ptr3);}1. 选择题:选项 : A.栈 B.堆 C.数据段(静态区 ...
Linux
未读操作系统(OS)的基础概念操作系统是计算机硬件和软件之间的中介,它负责管理计算机硬件资源并为应用程序提供一个运行环境。简单来说,操作系统的目标是使计算机变得更好用。它使得硬件的复杂性对用户透明,提供更高效的资源管理,并使应用程序能够正常运行。
1. 操作系统的层次结构操作系统通常由多个层次构成,每一层提供不同的功能:
硬件层(硬件) 这是计算机的基础物理部分,包括 CPU、内存、硬盘、显示器、键盘等。硬件直接提供计算和存储资源。
设备驱动层 这一层负责控制和管理硬件设备,如声卡、显卡、打印机等。操作系统通过设备驱动程序与硬件进行通信,确保硬件的正常运行。
操作系统层 这一层是操作系统的核心部分,负责管理硬件资源,调度进程,提供文件管理、内存管理等基本功能。常见的操作系统包括 Windows、Linux、macOS 等。
应用软件层 最顶层是应用软件,它包括各种应用程序,如 Word、Matlab 等。用户通过这些软件与计算机互动,完成各种任务。
2. 操作系统的功能
资源管理 操作系统需要高效管理计算机的资源,如 CPU 时间、内存、磁盘存储等。它通过调度算法分配资源,确保每个进程 ...
在 Linux 系统中管理用户账户:创建、设置密码及删除操作1. 创建新用户在 Linux 系统中,我们可以使用 adduser 或 useradd 命令来创建新用户。推荐使用 adduser 命令,因为它相对简单,且可以交互式地引导你完成用户创建过程。
创建新用户命令:1adduser 用户名
这里,用户名 是您自定义的用户名称。假设我们要创建一个名为 friend 的新用户,那么命令应该是:
1adduser friend
执行该命令后,系统将自动创建一个新的用户账户。具体操作步骤如下:
在 /home 目录下为该用户创建一个子目录(即 home/friend)。
配置默认的 shell(通常是 /bin/bash)。
创建该用户的相关信息文件,并将用户信息记录到 /etc/passwd 文件中。
示例输出:1[root@server]# adduser friend
执行该命令后,系统会创建新用户,并在终端中显示相关信息。
2. 为新用户设置密码在创建新用户后,我们需要为该用户设置一个密码。可以使用 passwd 命令来设置用户密码。
设置密码命令:1passwd 用户 ...
Linux 环境搭建全解析:从历史到实践Linux 作为开源操作系统,已经成为了当今信息技术领域的重要组成部分。无论是服务器、桌面,还是嵌入式设备,Linux 的身影几乎无处不在。那么,Linux 究竟是如何发展而来的?它又是如何在当今的技术世界中占据一席之地的?本篇博客将从 Linux 的历史背景出发,逐步讲解如何在 Linux 环境下进行开发与管理,最后提供具体的 Linux 环境搭建教程。
一、Linux 的起源与发展1.1 UNIX 的历史背景
在深入探讨 Linux 之前,我们需要了解它的前身——UNIX。UNIX 的诞生始于 1969 年,由 AT&T 贝尔实验室的 Ken Thompson 和 Dennis Ritchie 等人开发。最初,UNIX 被设计为一种多任务、多用户的操作系统,能够有效地支持科研工作。UNIX 继承了当时 Multics 操作系统的部分思想,但它的设计更加简洁和高效,这使得 UNIX 逐渐成为主流操作系统之一。
随着 UNIX 的逐步发展,不同的版本也相继诞生,包括伯克利软件发行版(BSD)和 System V。这两个版本代表了 UNIX ...
C++
未读1. 再谈构造函数在面向对象编程中,构造函数 是一种特殊的成员函数,它在对象创建时自动调用,负责初始化对象的成员变量(创建对象时赋初值),确保对象在创建时有一个有效的状态。接下来,我们将详细讲解关于构造函数的几个重要概念。
1.1 构造函数体赋值当我们创建一个对象时,构造函数会被自动调用,用来给对象的各个成员变量提供一个初始值。例如:
123456789class MyClass{public: int a; MyClass() { a = 10; // 这里是构造函数体中的赋值操作 }};
在这个例子中,构造函数的作用是将 a 赋值为 10。然而,这里要注意,构造函数体中的赋值操作和初始化是有区别的。构造函数体中对成员变量的赋值只能算是给成员变量“赋初值”,而不是“初始化”。因为初始化是指给成员变量设置一个初始值,而且初始化只能发生一次,而赋值操作可以发生多次。
再例如:
12345678910111213class A{ int _x;public: A(int x) ...