SE_Wang 的文章
  • 【Linux】【实战向】Linux 进程替换避坑指南:从理解 bash 阻塞等待,到亲手实现能执行 ls/cd 的 Shell

    一、为啥sleep命令会“卡住”?——bash的阻塞等待 先从一个小问题切入:为啥用execl调用sleep时,程序像“卡住”了? 其实这不是卡住,是bash在等它执行完。 比如你写了个程序,里面用execl调用系统的sleep命令(如图1、图2所示): // 类似图中代码的逻辑 #include <unistd.h> int main() { // 执行sleep 1秒:路径/bin/sleep,参数sleep、1,末尾NULL execl("/bin/sleep", "sleep", "1", NULL); return 0; } 当你运行这个程序时,bash(你的命令行父进程)会“阻塞等待”这个子进程(你写的程序)执行完。而你的程序又被sleep替换了,所以bash会等sleep跑完1秒才恢复,看起来就像“卡住”——这其实是正常的等待逻辑。   二、进程替换到底是啥?——不建新进程,只换“代码和数据” 很多人以为“执行新程序”就是“新建进程”,其实不是!进程替换的核心是:不创建新进程,只把当前进程的“代码和数据”换成新程序的。 就像一个人(进程)换衣服(代码和数据),身份证(PID、PCB进程控制块)没变,还是同一个人,只是穿的衣服不一样了。进程的“结构”(PID、PCB)早就建好,替换时只把里面的“代码段、数据段”覆盖掉。 你查man execl会发现:exec*函数成功时没有返回值,只有失败时返回-1。为啥? 因为一旦替换成功,当前进程的代码已经被新程序覆盖了——原来的代码(包括exec之后的返回语句)全没了,根本没法返回!只有替换失败时,原来的代码还在,才能返回-1告诉你“没换成”。   三、exec系列接口怎么用?——5个函数,记住“字母含义”就够了 exec有5个常用函数:execl、execlp、execv、execvp、execvpe。不用死记,记住字母代表的意思: l(list):参数用“列表”一个个传(比如sleep 1传成sleep, 1, NULL); v(vector):参数用“数组”传(把参数放进字符数组,最后放NULL); p(path):不用写全路径,系统会在PA……

    SE_Wang 2025-09-28
    61 0 0
  • 【Linux】网络--传输层--深入理解TCP协议

    一、TCP数据传输问题 1、发送数据丢包问题—重传机制 (一)客户端数据发送丢包 在我们客户端对服务器发送数据的时候,可能会出现丢包的问题,即数据没有到达服务器,此时服务器不会向客户端发送应答报文,客户端在等待了特定的时间后,会认为数据丢失,对已经发送的数据进行补发 这里是因为主机对于发出去的报文是否丢失是无法判定的,所以必须要通过一定的规定来决定是否要进行重传 (二)服务器确认应答丢包 还有一种情况就是发送数据没有丢包,但是服务器发给客户端的应答报文丢包了,同样的,对于客户端来说上面的情况和下面是一样的,客户端在等待了特定的时间后,会认为数据丢失,对已经发送的数据进行补发。这叫做超时重传 (三)时间间隔问题 最理想的情况下,找到一个最小的时间,保证确认应答在这个时间内返回,但是这个时间的长短随着网络环境的不同会有差异,如果超时时间设的太长,会影响整体的重传效率,如果超时时间设的太短,有可能会频繁发送重复的报文 TCP为了保证无论在任何环境下都能比较高性能的通信,因此会动态计算这个最大超时时间,一般Linux中超时以0.5s为一个单位进行控制,每次判定超时重发的超时时间都是0.5s的整数倍,如果重发一次仍得不到回答,等待2*0.5s,重发n次仍得不到回答,等待0.5*2^ns,以指数形式递增,累计到一定重传次数,TCP会认为网络或者对端主机出现异常,强制关闭连接 2、三次握手问题—奇数次握手 (一)验证可靠全双工 注意这里验证的是可靠和全双工两个概念,三次握手是最少次数的验证可靠全双工的方式 一次握手:一次握手就不必多说了,只能让服务器知道客户端是就绪的,而客户端对服务器丝毫不知情,此时只能验证客户端可发送报文,服务器可接收报文,并且多个客户端对服务器发起连接会造成SYN洪水问题,即服务器接受大量的各个客户端发来的SYN报……

    SE_Wang 2025-09-26
    32 0 0
  • 【Linux指南】Makefile进阶:通用化语法与实战技巧

    一、通用化语法的核心价值:告别重复劳动 在基础语法中,我们为每个目标文件编写单独的规则,例如: app: main.o func.o tool.o gcc main.o func.o tool.o -o app main.o: main.c gcc -c main.c -o main.o func.o: func.c gcc -c func.c -o func.o tool.o: tool.c gcc -c tool.c -o tool.o 当新增一个calc.c文件时,需要手动添加calc.o的规则和链接命令,效率极低。而通用化语法通过“批量处理”思想,将上述规则简化为: BIN = app SRC = $(wildcard *.c)  # 自动获取所有.c文件 OBJ = $(SRC:.c=.o)     # 自动生成对应的.o文件列表 CC = gcc $(BIN): $(OBJ) $(CC) $(OBJ) -o $(BIN) %.o: %.c $(CC) -c $< -o $@ 这种写法下,无论新增或删除.c文件,Makefile都无需修改,极大提升了可维护性。 二、变量:让Makefile更“可编程” 变量是通用化的基础,它能将重复出现的文件名、命令、选项等抽象为符号,便于统一修改。 1. 变量的定义与引用 Makefile中变量的定义格式为变量名=值,引用格式为$(变量名) BIN = mytest       # 最终目标文件名 SRC = $(wildcard *.c)  # 源文件列表(使用内置函数) OBJ = mytest.o     # 目标文件列表 CC = gcc           # 编译器 RM = rm -f         # 删除命令 BIN:存储可执行文件的名称; SRC:存储所有.c源文件的列表; OBJ:存储对应的.o目标文件列表; CC:指定编译器(如gcc或g++); RM:指定删除命令(带-f选项避免文件不存在时报错)。 2. 变量赋值的四种方式(扩展知识点) =(延迟赋值):变量的值在引用时才解析,可能受到后续赋值影响。 A = hello B = $(A) world A = hi # 引用B时,结果为“hi world”(A的最终值) :=(立即赋值):变量的值在定义时立即解析,不受后续赋值影响。 A := hello B := $(A) world A := hi # 引用B时,结果为“hello world”(……

    SE_Wang 2025-09-25
    46 0 0
  • 【Linux】聊聊文件那些事:从空文件占空间到系统调用怎么玩

    1. 空文件(内容为0)也占磁盘空间吗? 你可能会想:如果我在电脑上建一个文件,里面什么都不写(内容是0),它是不是就像“空气”一样,不占磁盘空间?其实不是——因为文件不只是“里面写的内容”,还包含它的“身份信息”(属性) ,这俩加起来才是一个完整的文件。 就像你给朋友寄快递,快递盒里的东西是“内容”,但快递单上的收件人、地址、寄件时间、快递单号这些“信息”,也是快递的一部分,不能少。文件的属性也一样,比如文件名、创建时间、修改时间、权限、存储位置——这些属性不管文件内容是不是空的,都得存在磁盘上,操作系统要靠它们找到文件、判断能不能操作它。所以哪怕文件内容是0,属性也会占一点磁盘空间(比如Linux里空文件默认占4KB,因为磁盘按“块”存数据,最小块就是4KB)。 而且我们对文件的所有操作(读、写、复制),本质都是围绕“内容+属性”展开的。这一点从文件在磁盘的存储逻辑上也能直观看到,比如下面这张图就展示了文件内容与属性在磁盘中的关联关系: 2. 文件存在哪? 我们平时说的“文件”,默认都是存在磁盘里的——不管是机械硬盘、固态硬盘还是U盘,都算“永久性存储介质”(内存是临时存储,断电就没了,所以文件不能只存内存)。 但磁盘是“外部设备”,系统不能直接操作它,必须通过“输入输出操作”(简称“IO”)交换数据:比如读文件是“输入”(把磁盘内容读到内存),写文件是“输出”(把内存数据写到磁盘)。换句话说,所有对文件的操作(打开、读、写、关闭),本质都是系统和磁盘之间的“IO操作”——没有IO,就没法跟磁盘里的文件打交道。 3. 谁在操作文件? 你双击打开文件、用cat看文件内容,背后其实是“进程”在干活(比如记事本进程、cat进程)——系统里只有进程能发起操作,你点击鼠标、输命令,本质是让某个进程执行“操作文件”的任务。 那进程怎么操作文件?比如用C语言写fopen("test.tx……

    SE_Wang 2025-09-24
    41 0 0
  • Linux 系统下 KingbaseES 完整部署指南:从安装准备到卸载与组件管理

    Linux 系统下 KingbaseES 完整部署指南:从安装准备到卸载与组件管理,本文详细介绍了 KingbaseES 在 Linux 系统的安装、安装后检查及卸载流程。安装前需完成用户创建(建议新建 kingbase 用户,设 UID、密码并赋予权限)、目录准备(安装目录默认 /opt/Kingbase/ES/V9,数据目录可自定义,还需创建软件存放路径)、安装包处理(官网或通过工作人员获取,校验 MD5/SHA1 值,上传后挂载 iso 文件)。安装有图形化、命令行、静默三种方式,均需选授权文件、安装路径、安装集(完全、服务器、定制安装)等。安装后可查日志、菜单、目录及版本验证,缺库需相应处理。卸载同样有三种方式,部分文件需手动删除,还提及增删组件的两种操作方式及目录结构、参数配置说明。   前言 中电科金仓(北京)科技股份有限公司(以下简称“电科金仓”)成立于1999年,是成立最早的拥有自主知识产权的国产数据库企业,也是中国电子科技集团(CETC)成员企业。电科金仓以“提供卓越的数据库产品助力企业级应用高质量发展”为使命,致力于“成为世界卓越的数据库产品与服务提供商”。 电科金仓自成立起始终坚持自主创新,专注数据库领域二十余载,具备出色的数据库产品研发及服务能力,核心产品金仓数据库管理系统KingbaseES(简称“KES”)是面向全行业、全客户关键应用的企业级大型通用数据库。KES产品V9版本已通过国家权威机构认证,产品核心源代码自主率达到100%。2018年,电科金仓申报的“数据库管理系统核心技术的创新与金仓数据库产业化”项目荣获国家科学技术进步二等奖。金仓数据库管理系统KES于2022年入选国务院国资委发布的十项国有企业数字技术典型成果,彰显数据库领域国家队硬实力。继2023年金仓数据库管理系统V8通过第一批《安全可靠测评》后,2024年金仓数据库管理系统V9、金仓分布式HTAP数据库软件集群V3再度入围,至此……

    SE_Wang 2025-09-23
    130 0 0
  • 【linux仓库】一文带你看透 Linux:文件系统与硬件的秘密通道

    回顾基础IO 前面的章节主要围绕已打开文件的操作与理解展开,重点在于说明文件与进程之间的关系。我们知道,文件大体可以分为两类:已打开的文件和未打开的文件。 对于未打开的文件,它们并不驻留在内存中,而是被保存在磁盘等存储设备上。这就引出了一个新的话题——数据保存的方案。接下来,我们将带领大家深入了解未打开文件的特性和存储方式,并逐步展开相关内容的介绍。 理解硬件 机械磁盘是计算机中唯⼀的⼀个机械设备,优点是:容量⼤,价格便宜。缺点:慢。而在像腾讯、阿里这样的公司里面,就有自己的机房,机房里面存在上万个机械磁盘,用来存储数据,而多出的机械磁盘则可以外租到外面。   一个磁片是具有正反两个磁面的。磁头和盘面也是一对一的,即一面一个磁头。 磁面上实际上是有很多的磁道,其间隙很小。 对于一个磁道会分出很多个小区域,称为扇区(sector),而扇区之间也是具有间隙的。扇区:是磁盘存储数据的基本单位,512字节,块设备。 磁头:像 “笔” ,负责对磁盘进行数据读写。写入时,把电信号转化为磁信号记录在磁盘磁性涂层;读取时,将磁盘磁信号还原成电信号,让系统获取数据,是数据交互核心部件。 磁头臂:是 “支架” ,带着磁头移动,精准定位到磁盘不同磁道,确保磁头在读写数据时,能稳定、准确到达指定位置,配合主轴(马达)带动磁盘转动,实现全盘数据访问 。 柱面其实就是磁道,相同半径的磁道看做一个整体。 一面一个磁头,而磁头之间是共进退的!!! 既然扇区是磁盘存储数据的基本单位。那么如何定位⼀个扇区呢? 从磁盘存储结构上我们可以知晓: 确定磁头,即选择哪一面; 确定哪个磁道或者柱面; 确定是哪一个扇区,从而定位到一个扇区。 对磁盘特定位置进行寻址: 左右摆动,本质是在定位哪一个磁道(柱面); 盘片旋转的本质:是确定了那一个磁道(柱面),定位该磁道(柱面……

    SE_Wang 2025-09-22
    25 0 0
  • Linux DNS服务器之BIND安装配置

    一、DNS工作流程 DNS工作流程: 客户端向本地DNS服务器发送请求查询www.example.com的主机地址 本地 DNS 服务器检查缓存 → 无记录,然后联系根服务器b.root-servers.net 根服务器返回.com TLD(Top Level Domain) 服务器地址d.gtld-servers.net 本地 DNS 服务器向 .com TLD 服务器询问:"example.com 的权威服务器是谁?" .com TLD 服务器返回example.com的NS记录 本地 DNS 服务器向example.com 权威 DNS 服务器请求www主机的A记录 本地 DNS 服务器从example.com 权威 DNS 服务器获取到www.example.com的A记录 本地 DNS 服务器将结果返回给客户端→A记录(12.34.56.78),同时写入缓存方便下次查询。 二、DNS主要类型 在DNS服务器中,BIND支持多种区域类型(zone type),其中最常见的四种是:hint、forward、master 和 slave。它们各自有不同的用途和特点 hint:用于初始化DNS服务器的根区域(root zone)。它提供了根域名服务器的初始列表 master/primary:区域权威主服务器,存储区域数据的原始副本 slave/secondary:区域权威从服务器,从主服务器同步区域数据 forword:将特定域名的所有查询请求转发到其他DNS服务器(通常是上游DNS服务器)   三、安装配置 3.1、安装命令 CentOS/RedHat yum install bind bind-utils -y Debian/Ubuntu apt install bind9 bind9utils -y 3.2、DNS服务配置 3.2.1、主配置文件: /etc/named.conf options { listen-on port 53 { 10.10.10.22; }; listen-on-v6 port 53 { ::1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; allow-query { any; }; masterfile-format text ; forward first; forwarders { 8.8.8.8; 223.5.5.5; ……

    SE_Wang 2025-09-19
    54 0 0
  • 如何探测网络上非法的 DHCP 服务器

    您是不是经常被局域网内非法的dhcp困扰?您的用户无法获得正确的ip而不能上网?看看这篇文章将会给您一定的提示:  一、首先简单介绍一下 DHCP 的工作流程 1、客户机发送 DHCPDISCOVER 广播消息 ,这个消息的 src ip 是 0.0.0.0 ,dst ip 是 255.255.255.255 。src mac 是客户机的 mac ,dst mac 是      ff:ff:ff:ff:ff:ff 。 注意!如果这个客户机之前获得某个 ip ,则它会使用 option requested-ip-address 来申明希望继续使用某个 ip ,否则为空 2、每个收到这个广播的 DHCP 服务器都会返回一个 DHCPOFFER ,src ip 是 DHCP 服务器的 ip ,dst ip 是 0.0.0.0 ,src mac 是服务器的 mac ,dst mac 是      客户机的 mac 。注意,服务器会在发送 DHCPOFFER 之前对要分配的 ip 发送一个 ping 包,如果收到响应则表示该 ip 被占用,不能分配,否则则可以被分配 3、客户机可能会收到多个 DHCPOFFER ,这时它处于 RFC 2131 中所规定的 SELECTING 状态。它可以从多个 OFFER 中挑选一个合适的。      默认是只接受第1个收到的 OFFER ,忽略其他的。这里正是我们需要修改的。 4、客户机发送一个 DHCPREQUEST 消息,src ip 是 0.0.0.0 ,dst ip 是 255.255.255.255 。src mac 是客户机的 mac , dst mac 是 ff:ff:ff:ff:ff:ff。      然后通过 option server-identifier 告诉所有 DHCP 服务器它选择的是那个 DHCP 服务器的 OFFER。     注意,在这个时间,客户机实际上已经拿到了 ip 了,可以实现点-点的通信了 5、其他没有被接受的 DHCP 服务器在收到 DHCPREQUEST 后就会知道自己的 OFFER 没有被接受,也就不再关心了 6、那个被选中的 DHCP 服务器返回一个 DHCP ACK 消息,src ip 是自己的 ip ,dst ip 是客户机的 ip 。src mac 是服务器的 mac ,dst mac 是客户机的 mac 7、这就完成了一个 lease 。 8、如果客户机是……

    SE_Wang 2025-09-19
    138 0 0
  • Linux 从入门到实践:CentOS 服务器配置与用户管理指南

    Linux的介绍 Linux是一个操作系统,是开源的,因此他免费,稳定,安全,高效;又因为这些优点,互联网公司的服务器后端一般用的这个操作系统(但是开源不代表着东西一定免费) Linux的版本分为1.商业化版本(有些是不免费的) 2.技术版本 我们一般用的是Centos 7.6/7.8/7.9(企业也一般用的这个) 开源的好处:能有更多人出力让其生态变好,然后就会有很多人用,市场占有率高,别人也不想它倒闭,就会捐助它 但是我们一般说Linux大多数指的是Linux内核 环境配置 三种途径:1.裸机安装或者双系统–不推荐 2.虚拟机安装–不推荐 3.云服务器安装–推荐(很多中小型公司也是选的这个) 云服务器的配置:(这种方式是以命令行形式操纵服务器的) 步骤: 1.购买云服务器(轻核应用服务器就行,系统镜像选择Centos 7.6/7.8/7.9) 注意:买完之后一定要重置root密码! 2.下载xShell,然后输入ssh root(这里是用户名,不一定是root)@服务器的IP地址,再回车 – 再输入密码 回车–后面会出现一个warning,不用管     指令: userdel -r 用户名 --删除该用户 adduser 用户名 --创建该用户 passwd 用户名 --给该用户设置密码 whoami --查询自己登录的这个号子的用户名 (这个密码要复杂一点,不然 云服务器上有恶意用户扫描自己,盗取拿去挖矿 ) (root和普通账户的密码尽量设置的不一样) 用户分为普通用户和超级用户--超级用户只有一个 超级用户和普通用户之间的切换方法: 普通用户切换成root su root 或者su root切换成普通用户 su 普通用户名 上面的切换方法,还会在当前目录里   su 后加个- 的话,就会回到家目录 引申:1.想切回原来账号直接ctrl+d就行 2.`root`登别人账号不用密码 3.普通用户设置的约束对`root`没用 引申:如果想对单条指令进行提权的话,可以用sudo指令 格式: sudo 指令 eg: sudo whoami 然后让你输密码 输完之后再 s……

    SE_Wang 2025-09-18
    91 0 0
  • 【Linux】【实战向】Linux 进程替换避坑指南:从理解 bash 阻塞等待,到亲手实现能执行 ls/cd 的 Shell

    一、为啥sleep命令会“卡住”?——bash的阻塞等待 先从一个小问题切入:为啥用execl调用sleep时,程序像“卡住”了? 其实这不是卡住,是bash在等它执行完。 比如你写了个程序,里面用execl调用系统的sleep命令(如图1、图2所示): // 类似图中代码的逻辑 #include <unistd.h> int main() { // 执行sleep 1秒:路径/bin/sleep,参数sleep、1,末尾NULL execl("/bin/sleep", "sleep", "1", NULL); return 0; } 当你运行这个程序时,bash(你的命令行父进程)会“阻塞等待”这个子进程(你写的程序)执行完。而你的程序又被sleep替换了,所以bash会等sleep跑完1秒才恢复,看起来就像“卡住”——这其实是正常的等待逻辑。   二、进程替换到底是啥?——不建新进程,只换“代码和数据” 很多人以为“执行新程序”就是“新建进程”,其实不是!进程替换的核心是:不创建新进程,只把当前进程的“代码和数据”换成新程序的。 就像一个人(进程)换衣服(代码和数据),身份证(PID、PCB进程控制块)没变,还是同一个人,只是穿的衣服不一样了。进程的“结构”(PID、PCB)早就建好,替换时只把里面的“代码段、数据段”覆盖掉。   关键问题:为啥exec系列函数“只有失败返回值”? 你查man execl会发现:exec*函数成功时没有返回值,只有失败时返回-1。为啥? 因为一旦替换成功,当前进程的代码已经被新程序覆盖了——原来的代码(包括exec之后的返回语句)全没了,根本没法返回!只有替换失败时,原来的代码还在,才能返回-1告诉你“没换成”。 三、exec系列接口怎么用?——5个函数,记住“字母含义”就够了 exec有5个常用函数:execl、execlp、execv、execvp、execvpe。不用死记,记住字母代表的意思: l(list):参数用“列表”一个个传(比如sleep 1传成sleep, 1, NULL); v(vector):参数用“数组”传(把参数放进字符数组,最后……

    SE_Wang 2025-09-17
    71 0 0