-
Linux《基础IO》
在之前的篇章的当中我们已经学习了进基础的概念以及进程控制相关的概念,那么接下来在本篇当中就可以开始了解LInux当中的基础IO。在此先会通过复习之前C语言当中的文件IO来引入文件系统的相关调用接口,了解了这些接口之后就能理解之前学习的语言当中文件相关本质是如何执行;接下来将了解到文件描述符这一新概念,理解重定向的本质;再对我们之前实现的自主命令行解释器新增重定向的功能,并且还要理解为什么说Linux下一切皆文件,再理解内核缓冲区和文件缓冲区的区别,最后简单设计libc库。一起加油吧!!! 目录 1.理解文件 2.接口回顾 3. 引入I/O系统调用 4. 文件描述符 5. 重定向 6. 给myShell添加重定向功能 完整代码 7. 理解“一切皆为文件” 8. 缓冲区 9. 简单设计libc库 1.理解文件 通过之前的学习知道文件=文件内容+文件属性。当文件内的内容为空时文件也是要占据相应的内存空间,但是文件原本是存储在磁盘当中的,当用户进行相应的文件操作实际上的流程是怎么样的呢? 我们知道在冯诺依曼体系当中CPU是只和内存打交道的,那么原本存储在磁盘当中的文件要进行对应的操作就需要先从磁盘加载到内存上;在该过程当中实现是由操作系统创建对应的进程之后由进程来实现以上的操作,这些进程本质上就是相应的系统调用,而在语言的层面上是通过封装相应恶的系统调用来实现出函数提供给用户使用;例如在C当中的fopen、fwrite、fclose等文件相关大的操作。 但用户可能会同时打开多个文件,那么这就使得需要对打开的文件进行管理,这其实是由操作系统来实现的。在本篇当中本质上了解的是“内存”级的文件,而要了解文件是如何在磁盘当中进行读取的需要等到之后的文件系统篇章中。 2.接口回顾 通过之前的学习我们已经了解了C当中提供的文件相关的操作函数,那么接下来就先复习这些函数的使用,之后再通过这些函……
SE_Wang 2025-11-28
73 0 0 -
【Linux】进程信号(一)信号原理、产生方式、调试技巧(含代码示例)
一. 认识信号 首先我们应该知道信号和信号量之间没有任何关系。 生活中的信号比如说:闹钟,红绿灯,上课铃声,狼烟,电话铃声,肚子叫,脸色等。 闹钟响了我们就得起床,上课铃声响了我们就得进教室进行上课,狼烟起来了士兵们就知道要打仗了,电话铃声响了我们就知道来电话了,肚子叫我们就知道我们的肚子饿了,一个人的脸色不好,我们就能直到他可能生气了。 什么是信号?中断我们人正在做的事情,是一种事件的异步通知机制 其实进程就相当于我们的人,当进程收到信号时,进程就要中断进程正在做的事情,这种方式就叫做信号,所以信号是给进程发送的,用来进行事件异步通知的机制 信号的产生相对于进程的运行是异步的 信号是发给进程的 基本结论: 信号处理在信号没有产生时就知道该如何处理了 信号的处理不是立即处理,可以等一会再处理,在合适的时候进行处理 人能识别信号前提是被“教育”过的(红灯亮了要等一等),进程也是如此,OS程序员设计的进程,进程早已经内置的对于信号的识别和处理方式! 信号源是非常多的,给进程产生信号的信号源也非常多 二. 产生信号的方式 2.1 键盘产生信号 我们先编写一段代码testSig.cc #include <iostream> #include <unistd.h> int main() { while(true) { std::cout << "Hello world" << std::endl; sleep(1); } return 0; } 当这段代码运行起来后我么想终止,我们可以使用ctrl + c,但为什么ctrl + c可以终止呢? 因为ctrl + c是给目标进程发送信号的。相当一部分信号的处理动作就是让进程自己终止。 查看linux中的信号列表 指令:kill -l 在我们计算机中,信号就是一个整数的数字,我们未来想要用进程的话,可以用该数字向目标进程发送信号,但是数字的可读性不是很好,未来我们在使用的时候,会……
SE_Wang 2025-11-27
46 0 0 -
在 Linux 系统上安装 MATLAB:从下载到启动的完整指南
前言 对于科研人员、工程师和学生来说,MATLAB 是一款不可或缺的强大工具,它在数值计算、算法开发、数据分析和模型仿真等领域有着广泛的应用。虽然 MATLAB 在 Windows 和 macOS 上更为常见,但许多用户(尤其是高性能计算和服务器环境)更喜欢或需要在 Linux 系统上运行它。Linux 提供了无与伦比的稳定性、强大的命令行工具和灵活的配置选项,与 MATLAB 的计算能力相结合,能极大提升工作效率。 然而,对于不熟悉 Linux 的用户来说,在其上安装 MATLAB 可能会遇到一些挑战,例如处理安装文件、破解(如果使用非正版)以及创建桌面快捷方式等。本篇博客将提供一个一步步的详细教程,引导你顺利完成在 Ubuntu、CentOS 等主流 Linux 发行版上安装 MATLAB 的全过程。 第一步:准备工作 获取安装文件: 正版用户:请从 MathWorks 官网下载适用于 Linux 的安装文件(通常是一个 .iso 镜像文件)和你的许可证文件。 其他方式:你可能已经拥有了一个包含 Crack 破解文件的安装包。常见的文件结构通常包含 R20xxxglnxa64.iso 镜像文件和 Crack 文件夹。 安装依赖项: 为了避免安装和运行过程中出现库文件缺失的问题,最好先安装一些常见的依赖库。以 Ubuntu/Debian 为例,打开终端 (Ctrl+Alt+T),运行以下命令: sudo apt update sudo apt install libc6-i386 libXext6 libXp6 libXt6 libXtst6 libxmu6 libxpm4 libxslt1.1 libgstreamer1.0-0 libgstreamer-plugins-base1.0-0 对于 CentOS/RHEL/Fedora,可以使用 yum 或 dnf 命令安装相应的依赖。 挂载 ISO 镜像文件: Linux 无法直接双击打开 .iso 文件。你需要通过终端命令将其“挂载”到一个目录上。 # 首先,创建一个目录作为挂载点 sudo mkdir /media/matlab # 然后,挂载你的ISO文件 (请将 /path/to/your/R20xxxglnxa64.iso 替换为你的实际文件路径) sudo mount -o l……
SE_Wang 2025-11-26
40 0 0 -
Linux 权限实战:从概念到命令,搞定文件访问控制的核心逻辑
前言: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击人工智能教程跳转到网站。” 在 Linux 系统中,“权限” 是保障文件安全、划分用户操作边界的核心机制。你是否遇到过 “普通用户删不掉自己创建的文件”“root 用户才能修改系统配置” 这类问题?其实都是权限在背后起作用。这篇文章结合 理论知识与实战命令示例,从权限的基本概念讲到实操技巧,帮你搞懂 Linux 权限的逻辑与用法。 一. 先理清:Linux 权限的核心逻辑 Linux 作为多用户操作系统,通过 “谁能操作” 和 “能做什么操作” 两大维度控制文件访问,核心是 “按角色(身份)分配权限”。 1.1 两类用户(人):超级用户与普通用户 Linux 中用户分为两种,权限差异极大: 超级用户(root):命令提示符为#,可执行系统中任何操作(如删除系统文件、修改权限),不受限制; 普通用户:命令提示符为$,仅能操作自己权限范围内的文件(如修改自己的文档),受严格限制。 添加用户的操作(删除的话之前讲过,这里就不演示了): [root@VM-4-4-centos lesson5]# adduser Lotso [root@VM-4-4-centos lesson5]# passwd Lotso Changing password for user Lotso. New password: Retype new password: passwd: all authentication tokens updated successfully. 通过su,su-命令可切换用户,示例: su:只进行“身份切换”,不改变当前的工作环境(环境变量、工作目录等)。 su -:进行“完整的登录切换”,会模拟一次完整的登录过程,包括切换工作目录和加载目标用户的环境变量。 # 普通用户whb切换到root(需输入root密码) [whb@bite-alicloud ~]$ su root Password: [root@bite-alicloud ~]# whoami # 验证当前用户 root # root切换到普通用户whb(无需密码) [root@bite-alicloud ~]# su whb [whb@bite-alicloud ~]$ whoami whb #s……
SE_Wang 2025-11-25
16 0 0 -
深入理解 Linux 系统文件 I/O:从 open 到重定向的底层逻辑
前言 在 Linux 系统中,程序与文件的交互离不开 “系统文件 I/O”—— 这是操作系统为用户层程序提供的一套底层接口,也是理解 “程序如何操作文件” 的核心钥匙。无论是我们日常使用的文本编辑器,还是后台运行的服务程序,其读写文件、处理输入输出的能力,最终都依赖于open、write、read、dup2这些系统调用。 但对于很多开发者来说,系统文件 I/O 的知识点常常是零散的:标志位的组合有什么规律?open返回的文件描述符到底是什么?为什么fd=0、1、2总是被默认占用?重定向又是如何通过dup2实现的?这些问题看似独立,实则围绕 “文件描述符” 这一核心概念紧密相连。 本文将以 “文件描述符” 为线索,从 “传递标志位”“初识 open” 入手,逐步拆解写文件、读文件的操作逻辑,再深入讲解文件描述符的分配规则,最终聚焦重定向的实现原理(包括dup2调用与输入输出重定向)。无论你是刚接触 Linux 开发的新手,还是想夯实底层基础的开发者,都能通过本文理清系统文件 I/O 的脉络,理解从接口调用到系统底层的映射关系。 打开文件的方式不仅仅是fopen,ifstream等流式,语言层的方案,其实系统才是打开文件最底层的方案。不过,在学习系统文件IO之前,先要了解下如何给函数传递标志位,该方法在系统文件IO接口中会使用到: 传递标志位 了解下如何给函数传递标志位,该方法在系统文件IO接口中会使用到: #include <stdio.h> #define ONE_FLAG (1<<0)//0000 0000 0000...0000 0001 #define TWO_FLAG (1<<1)//0000 0000 0000...0000 0010 #define THREE_FLAG (1<<2) //0000 0000 0000...0000 0100 #define FOUR_FLAG (1<<3)//0000 0000 0000...0000 1000 void print(int flags){ if(flags & ONE_FLAG){ printf("One!\n"); } if(flags & TWO_FLAG){ printf("Two!\n"); } if(flags & T……
SE_Wang 2025-11-24
10 0 0 -
[linux仓库]线程控制
POSIX线程库 与线程有关的函数构成了⼀个完整的系列,绝⼤多数函数的名字都是以“pthread_”打头的 要使用这些函数库,要通过引入头文件<pthread.h> 链接这些线程函数库时要使⽤编译器命令的“-lpthread”选项 创建线程 int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void *), void *restrict arg); 功能:创建⼀个新的线程 参数: thread:返回线程ID(输出型参数),这个id是指lwp吗?并不是,lwp不需要暴露给用户,至于是什么下文会揭晓. attr:设置线程的属性(优先级,栈大小之类),attr为NULL表示使⽤默认属性 start_routine:回调函数(函数指针类型),线程启动后要执⾏的函数 arg:传给线程启动函数的参数 RETURN VALUE On success, pthread_create() returns 0; on error, it returns an error number, and the contents of *thread are undefined. 返回值:成功返回0;失败返回错误码 错误检查: 传统的⼀些函数是,成功返回0,失败返回-1,并且对全局变量errno赋值以指示错误。 pthreads函数出错时不会设置全局变量errno(⽽⼤部分其他POSIX函数会这样做)。⽽是将错误代码通过返回值返回 pthreads同样也提供了线程内的errno变量,以⽀持其它使⽤errno的代码。对于pthreads函数的错误,建议通过返回值业判定,因为读取返回值要⽐读取线程内的errno变量的开销更小 举个梨子: // 新线程 void *thread_routine(void *args) { std::string threadname = static_cast<const char *>(args); while (true) { printf("new thread...\n"); sleep(1); } } int main() { pthread_t tid; int n = pthread_create(&tid, nullptr, thread_routine, (void *)"thread-1"); (void)n; // 避免警告 // 主线程 sleep(2); while (true) { printf("main thread..……
SE_Wang 2025-11-21
17 0 0 -
鸿蒙分布式智能办公应用的架构设计与性能优化
一、项目背景与挑战 在企业数字化转型的浪潮中,办公应用的需求日益增长。传统的办公应用通常局限于单一设备使用,难以满足现代办公场景下的多设备协同需求。随着HarmonyOS的发布,其分布式特性为解决这一痛点提供了新的思路。 项目概述 我们开发的分布式智能办公应用旨在实现多设备间的无缝协同办公,用户可以在手机、平板、智慧屏等不同形态的设备上流畅切换,保持工作状态的连续性。主要功能包括文档编辑、日程管理、视频会议、即时通讯等核心办公场景。 1.1 面临的技术挑战 设备异构性:需要适配不同屏幕尺寸、性能规格的鸿蒙设备 状态同步:确保多设备间的数据和用户状态实时同步 性能优化:在保证功能丰富性的同时,确保应用在各类设备上流畅运行 安全保障:分布式环境下的数据传输和存储安全 选择HarmonyOS作为开发平台,正是看中了其分布式能力带来的跨设备协同优势,这为我们打造下一代智能办公体验提供了坚实的技术基础。 二、分布式架构设计 2.1 整体架构概览 我们采用分层架构设计,将应用分为表现层、业务逻辑层、数据服务层和设备适配层四个主要层次。这种设计使得各层职责清晰,便于维护和扩展。 架构层级 主要职责 核心技术 表现层 UI渲染、用户交互 ArkTS声明式UI、自适应布局 业务逻辑层 业务处理、状态管理 分布式任务调度、状态同步 数据服务层 数据存储、访问控制 分布式数据库、云存储 设备适配层 设备能力调用、兼容性处理 设备管理器、软总线 架构优势: 高内聚低耦合:各层职责明确,降低模块间依赖 可扩展性强:支持新功能和新设备的快速接入 可维护性好:便于定位问题和迭代优化 2.2 组件化设计 基于ArkTS的组件化能力,我们构建了一套可复用的组件库,提升开发效率和代码质量。 // 核心组件基类设计 abstract class BaseComponent { // 组件生命周期管理 protected onCreate?(): vo……
SE_Wang 2025-11-20
10 0 0 -
Linux 新手必学:yum 软件管理 + vim 编辑器使用与配置全攻略
一、软件包管理器 1.1 什么是软件包? 在 Linux 下安装软件,一个通常的办法是下载到程序的源代码,并进行编译,得到可执行程序. 但是这样太麻烦了,于是有些人把一些常用的软件提前编译好,做成软件包 (可以理解成 windows 上的安装程序) 放在一个服务器上,通过包管理器可以很方便的获取到这个编译好的软件包,直接进行安装. 软件包和软件包管理器,就好比 "App" 和 "应用商店" 这样的关系. yum (Yellow dog Updater, Modified) 是 Linux 下非常常用的一种包管理器。主要应用在 Fedora, RedHat, Centos 等发行版上. Ubuntu:主要使用 apt(Advanced Package Tool)作为其包管理器。apt 同样提供了自动解决依赖关系、下载和安装软件包的功能。 1.2 Linux软件生态 1、Linux下载软件的过程(Ubuntu、Centos、other) yum(Yellowdog Updater Modified)是最常用的软件包管理器 —— 它能自动解决依赖关系,无需手动下载安装依赖包,极大简化软件管理流程。 yum 通过 “软件仓库(Repository)” 获取软件包,系统默认已配置官方仓库 2、Linux软件包生态问题 Linux软件包生态问题的核心就是:如何评估一款操作系统的好坏? 操作系统为什么要有完善的生态? 答:因为可以被更多人使用! 思考:一款操作系统诞生后,最重要的事情是什么? 是有人使用!但是你如何保证自己的操作系统呗更多的人用起来? 操作系统生态包含了这六个方面:社区论坛、官方文档、软件体系、维护更新速度、操作系统自身、复有针对性的客户群体 3、为什么会有人免费特定社区提供软件,还发布?还提供云服务器让你下载? 4、软件包依赖问题 5、国内镜像源 以下是一些国内 Linux 软件安装源的官方链接: 阿里云官方镜像站 官方链接:https://developer.aliyun.com/mirror/ 阿里云提供了丰富的 Linux 发行版镜像……
SE_Wang 2025-11-19
19 0 0 -
【Linux】五种IO模型 + 非阻塞IO
一,五种IO模型 IO = 等 + 拷贝 I/O 效率是 “减少等待” 和 “优化拷贝” 共同决定的。但在硬件相同,拷贝次数相同的场景下,减少等待时间是提高IO效率的关键。 阻塞IO:数据到来前,进程一直在read等,直到数据到来 非阻塞IO:如果内核还未将数据准备好, 系统调用仍然会直接返回, 并且返回EWOULDBLOCK 错误码 非阻塞 IO 往往需要程序员循环的方式反复尝试读写文件描述符, 这个过程称为轮询. 这对 CPU 来说是较大的浪费, 一般只有特定场景下才使用. 信号驱动 IO:内核将数据准备好的时候, 使用 SIGIO 信号通知应用程序进行 IO操作。(属于同步IO,因为拷贝是自己完成的) IO 多路转接:同时等待多个文件描述符的就绪状态。 异步 IO:由内核在数据拷贝完成时, 通知应用程序(异步IO不参与 等 + 拷贝的任意一个过程) 同步 vs 异步: 同步IO:参与等 or 拷贝中任意一个阶段(调用方需要主动等待结果就绪,或要亲自处理结果)。同步通信:参与调用 or 等待返回结果任意一个阶段,调用返回,结果跟着返回。 异步:不参与任意一个阶段(调用方无需等待结果,由 “第三方”等待结果并处理,处理完后再通知调用方“完成了”)。 二,非阻塞IO 1. fcntl 一个文件描述符,默认都是阻塞 IO。fcntl允许我们设置文件描述符的标记位,让我们可以把文件描述符设置成非阻塞IO cmd:命令,它决定了 fcntl 函数要执行的操作类型。不同的 cmd 对应不同的功能,也对应不同的返回值例如(主要用到的): F_GETFL:获取文件的状态标志(比如是否为非阻塞模式等)。 F_SETFL:设置文件的状态标志。 ... /* arg */:可变参数,根据 cmd 的不同,这个参数的意义和类型也不同。例如,当 cmd 是 F_SETFL 时,arg 用于传递要设置的标志。 标记有:O_APPEND,O_NONBLOCK…(本质是设置了特定比特位的宏) 一般我们可以先通过F_GETFL获取到原来的标志……
SE_Wang 2025-11-18
14 0 0 -
Linux 新手必学:yum 软件管理 + vim 编辑器使用与配置全攻略
本篇学习目标: 学习yum工具,进行软件安装 掌握vim编辑器使用,学会vim的简单配置 一、软件包管理器 1.1 什么是软件包? 在 Linux 下安装软件,一个通常的办法是下载到程序的源代码,并进行编译,得到可执行程序. 但是这样太麻烦了,于是有些人把一些常用的软件提前编译好,做成软件包 (可以理解成 windows 上的安装程序) 放在一个服务器上,通过包管理器可以很方便的获取到这个编译好的软件包,直接进行安装. 软件包和软件包管理器,就好比 "App" 和 "应用商店" 这样的关系. yum (Yellow dog Updater, Modified) 是 Linux 下非常常用的一种包管理器。主要应用在 Fedora, RedHat, Centos 等发行版上. Ubuntu:主要使用 apt(Advanced Package Tool)作为其包管理器。apt 同样提供了自动解决依赖关系、下载和安装软件包的功能。 1.2 Linux软件生态 1、Linux下载软件的过程(Ubuntu、Centos、other) yum(Yellowdog Updater Modified)是最常用的软件包管理器 —— 它能自动解决依赖关系,无需手动下载安装依赖包,极大简化软件管理流程。 yum 通过 “软件仓库(Repository)” 获取软件包,系统默认已配置官方仓库 2、Linux软件包生态问题 Linux软件包生态问题的核心就是:如何评估一款操作系统的好坏? 操作系统为什么要有完善的生态? 答:因为可以被更多人使用! 思考:一款操作系统诞生后,最重要的事情是什么? 是有人使用!但是你如何保证自己的操作系统呗更多的人用起来? 操作系统生态包含了这六个方面:社区论坛、官方文档、软件体系、维护更新速度、操作系统自身、复有针对性的客户群体 3、为什么会有人免费特定社区提供软件,还发布?还提供云服务器让你下载? 4、软件包依赖问题 5、国内镜像源 以下是一些国内 Linux 软件安装源的官方链接: 阿里云官方镜像站 官方……
SE_Wang 2025-11-17
19 0 0
