浅析空洞文件

Windows进程注入实战:从DLL注入到线程劫持的五种创新技术 进程注入是Windows系统安全与软件开发中的一项核心技术,其本质是通过突破进程内存空间隔离,使目标进程执行外部代码。从原理层面看,它利用虚拟内存机制和系统API(如OpenProcess、VirtualAllocEx)实现跨进程内存操作。这项技术的工程价值在于,它不仅是恶意软件常用的隐蔽手段,更是安全研究、软件调试和功能扩展的重要工具。在应用场景上,进程注入广泛用于游戏修改、安全监控、软件插件加载等领域。本文聚焦五种创新注入技术,包括反射式DLL注入和APC注入,深入解析其实现逻辑与实战要点,为开发者与安 阅读详情

1.什么是空洞文件?

“在UNIX文件操作中,文件位移量可以大于文件的当前长度,在这种情况下,对该文件的下一次写将延长该文件,并在文件中构成一个空洞,这一点是允许的。位于文件中但没有写过的字节都被设为 0。”      --摘自“百度百科”

从上面的描述可以将空洞文件的特点表述为:offset > 实际文件大小。那这又有什么表现和意义呢?我们下面慢慢分析。


2.怎么获得一个空洞文件?

在linux下,利用lseek人为的修改offset可以获得一个空洞文件。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <string.h>

#define OFFSET_LENGTH 15000

char buff1[] = "abcdefg";
char buff2[] = "ABCDEFG";

int
main(int argc,char** argv)
{
	int fd = 0;
	
	int buff1Length = strlen(buff1);
	int buff2Length = strlen(buff2);
	
	char* buff3 = (char*)malloc(buff1Length + buff2Length + OFFSET_LENGTH);
	memset(buff3,2,buff1Length + buff2Length + OFFSET_LENGTH);
	
	//create hole file
	if((fd = creat("./hole.f",S_IREAD|S_IWRITE)) < 0)
	{
		perror("create file error!");
	}
	
	printf("fd:%d\n",fd);
	if(write(fd,buff1,buff1Length) != buff1Length)
	{
		perror("write error!");
	}
	
	if(lseek(fd,OFFSET_LENGTH,SEEK_CUR) == -1)
	{
		perror("lseek error!");
	}
	
	if(write(fd,buff2,buff2Length) != buff2Length)
	{
		perror("write error!");
	}
	
	//create nohole file
	if((fd = creat("./nohole.f",S_IREAD|S_IWRITE)) < 0)
	{
		perror("create file error!");
	}
	
	if(write(fd,buff3,strlen(buff3)) != strlen(buff3))
	{
		perror("write error!");
	}
	
	free(buff3);
	
	return 0;
}

上面的程序创建了一个空洞文件和一个同样大小的非空洞文件,接下来我们将以这两个文件作为基础进行空洞文件的分析。


3.空洞文件的表现

空洞文件特点就是offset大于实际大小,也就是说一个文件的两头有数据而中间为空,以‘\0‘填充。那文件系统会不会不做任何处理的将其存放在硬盘上呢?答案是否定的,文件系统没有傻到这种程度,因为这实际是中浪费,也是一种威胁,因为一旦黑客利用这个漏洞不断侵蚀磁盘资源,计算机就崩溃了。所以说,文件系统肯定会做相应的处理,下面我就来验证一下。

用ls来展现两个文件:


我们在用du来展现两个文件(du命令用于报告文件所使用的磁盘空间总量):


可以看到,用ls展现的空洞和非空洞的大小完全相同,而用du命令展现的则有差别,一个占用了8个1024的字节块,而一个占用了16个1024的字节块。这里有个问题,文件大小为15014,算下来最多就15个block,为什么是16个呢?在《APUE》中有这样的解释:"文件系统使用了若干块以存放指向实际数据块的各个指针"。

为什么会这样呢?原因是ls展现的文件的逻辑大小,也就是文件在文件系统表现出来的大小,而du展现的是文件物理大小,也就是文件在磁盘上实际所占的block数。所以说,空洞文件在文件系统表现的还是和普通文件一样的,但是实际上文件系统并没有给他分配所表现出来的那么多空间,只是存放了有用的信息。

接下俩我们再来看一个现象:

首先我们用cat来输出空洞文件中内容,然后重定向到一个新的文件中:


我们再来用cp去复制一个文件:


可以看到,用cat得到的文件,文件实际占用的block增加了,而cp的没有。那是因为cat在复制空洞文件时会将空洞补齐,将空洞填以0,因为cat命令就是简单的read和write的操作,read在遇到空洞时读出0,write则写入0,这时文件就变成了非空洞文件,而cp在复制文件时不会,cp命令会去判断文件是否有空洞,如果有,则会调用lseek进行空洞的模拟,所以还是会保持和源文件的一致性。


4.空洞文件有什么用?

空洞文件作用很大,例如迅雷下载文件,在未下载完成时就已经占据了全部文件大小的空间,这时候就是空洞文件。下载时如果没有空洞文件,多线程下载时文件就都只能从一个地方写入,这就不是多线程了。如果有了空洞文件,可以从不同的地址写入,就完成了多线程的优势任务。

感觉这并不是空洞文件的全部作用,后续将进行补充。。。。



Intel RealSense D435深度相机从入门到实战:环境搭建、数据采集与点云生成 深度感知是计算机视觉领域的核心技术之一,它通过测量物体到相机的距离,为机器提供三维空间理解能力。其原理主要基于立体视觉或飞行时间法,通过分析红外结构光或激光的反射来计算出深度信息。这项技术的核心价值在于将二维图像扩展为三维数据,极大地提升了机器对环境的感知精度,在机器人导航、三维重建、体积测量和增强现实等场景中具有不可替代的作用。本文以Intel RealSense D435这款经典的主动立体深度相机为例,详细解析其深度感知原理,并提供了从环境搭建、数据采集到关键参数调整的完整工程实践指南。针对开发中常见的 阅读详情

相关推荐

【linuxC语言】空洞文件

在 Linux 系统编程中,空洞文件是一种特殊类型的文件,它包含了逻辑上的空洞,也就是说文件中的某些部分并没有实际写入数据。尽管文件在逻辑上可能非常大,但实际上只占用了磁盘上的少量空间。空洞文件在实际应用中有许多有趣的用途,可以帮助节省磁盘空间、加快文件传输速度以及进行性能测试等。本文将探讨空洞文件的定义、创建方法以及其在 Linux 系统编程中的应用。空洞文件是一种在磁盘上占用空间但实际内容中有一部分为零字节的文件。

m0_62599305的博客 2827

空洞文件(Linux应用编程篇)

1、什么是空洞文件 因为在使用系统调用API中的read/write函数进行文件的读写操作,但是这个过程的中出现文件头在不断的变化, 为了解决上面的问题,我们引用了系统调用中的lseek函数来对文件头的位置设定操作,让我们对文件读写操作有迹可循。此函数不但可以改变位置偏移量,并且还允许文件偏移量超出文件长度 一个文件的大小为4K,此时使用lseek函数将文件的头移动到地址6k处,再用write函数将文件写入,这样的导致4000-6000之间产生了空洞,因为这一部分并没有写入任何的数据,这一部分区

栋哥修炼日记 2646

Synopsys工具filter命令:从数据筛选到高效IC设计的实战指南

在数字集成电路设计流程中,数据筛选与查询是工程师处理海量网表、时序报告和设计约束的核心需求。其原理在于通过声明式查询语言,直接对设计对象(如单元、网络、路径)的属性进行逻辑判断与模式匹配,从而精准定位目标。这种技术价值在于将工程师从繁琐的过程式脚本循环中解放出来,大幅提升代码可读性与运行效率,直接调用工具内置的高性能查询引擎。在实际应用场景中,它广泛用于物理与时序联合分析、层次化模块操作、动态约束生成以及自动化报告生成。本文聚焦于Synopsys工具链中filter命令的高阶用法,深入解析其表达式语法、正则

weixin_28007513的博客 577

文件IO——从空洞文件到文件共享的全面解析

在Linux系统编程中,是一种特殊的文件类型,主要用于节省磁盘空间。当文件中存在未写入实际数据的部分时,这些部分会被称为“空洞”。在空洞文件中,这些“空洞”不会实际占用磁盘空间,而是在读取时返回零值。

zhaozhaoxiyang的博客 1304

别再搞混了!Vue3里xgplayer播放FLV视频与FLV直播流,配置到底差在哪?

本文详细解析了在Vue3项目中使用xgplayer播放FLV视频与FLV直播流的配置差异,帮助开发者避免常见错误。通过对比点播与直播的核心协议差异、插件选择及配置参数,提供实战代码示例和性能优化技巧,确保流畅播放体验。特别针对直播流场景,深入讲解专属配置和问题排查方法。

weixin_28687331的博客 150

静态时序分析(Static Timing Analysis, STA):简介及内容导航

静态时序分析(简称STA)是用来验证数字设计时序的技术之一,另外一种验证时序的方法是时序仿真,时序仿真可以同时验证功能和时序。“时序分析”这个术语就是用来指代“静态时序分析“或”时序仿真“这两种方法之一,简单来说,时序分析的目的就是为了解决设计中的各种时序问题。STA被称为静态的原因是其对于设计的分析是静态地执行的,并不依赖于施加在输入端口上的激励。相比之下,时序仿真则可以被视作动态地执行对设计的分析,具体过程描述如下:施加一组激励,观察在这组激励下电路行为是否符合要求,然后换一组激。

Starry__的博客 1989

Linux应用编程之空洞文件

空洞文件(hole file)的描述: 使用 lseek 可以修改文件的当前读写位置偏移量,此函数不但可以改变位置偏移量,并且还允许文件偏移量超出文件长度,这是什么意思呢?譬如有一个 test_file,该文件的大小是 4K(也就是 4096 个字节),可以通过 lseek 系统调用将该文件的读写偏移量移动到偏移文件头部 6000 个字节处。 接下来使用 write()函数对文件进行写入操作,也就是说此时将是从偏移文件头部 6000 个字节处开始写 入数据,也就意味着 4096~6000 字节之间.

shengnan89的博客 2170

R 分析裂区试验设计

裂区试验有主区部分和副区部分, 因而有主区部分误差(误差 a,简记为Ea )和副区部分误差(误差b,简记为Eb) 分别用于测验主区处理以及副区处理和主、副互作的显著性。对同一个二因素试验资料作自由度和平方和的分解,则可发现随机区组的误差项自由度和平方和分别为DFe、SSe,而裂区设计有两个误差项,其自由度和平方和分别为DFEa,DFEb, SSEa, SSEb。而区组,处理效应等各个变异项目的自由

samhuairen的专栏 8934

嵌入式Linux系统编程 — 1.3 空洞文件与文件共享

在 Linux 系统中, open 返回得到的文件描述符 fd 可以进行复制, 复制成功之后可以得到一个新的文件描述符,使用新的文件描述符和旧的文件描述符都可以对文件进行 IO 操作,复制得到的文件描述符和旧的文件描述符拥有相同的权限。这种情况非常简单,多次调用 open 函数打开同一个文件会得到多个不同的文件描述符,并且多个文件描述符对应多个不同的文件表,所有的文件表都索引到了同一个 inode 节点,也就是磁盘上的同一个文件。函数时,如果成功,都会返回一个新的文件描述符,即使打开的是同一个文件。

几度春风里的博客 1237

Python爬虫教程:抓取区块链交易信息及加密货币市场数据

随着区块链技术和加密货币的迅猛发展,区块链交易和加密货币市场的数据逐渐成为金融、技术、经济研究等领域的热点。对于开发者和研究者而言,实时获取区块链交易数据和加密货币市场行情,对于投资分析、市场预测、技术研究等具有重要的参考价值。本文将通过Python爬虫技术,介绍如何抓取区块链交易信息及加密货币市场数据,详细阐述数据获取的原理、技术方案、实现方法以及抓取到的数据的存储与分析。我们将依托最新的爬虫技术,如requestsSeleniumScrapy,以及相关的数据处理库(如pandasmatplotlib。

2201_76125261的博客 2777

YOLOv11 改进策略之 Conv 篇:基于 C2fC 与 RepC_SPELAN4 的性能跃迁教程

某工业质检场景中,采用本文改进模块的 YOLOv11 模型,对微小零件缺陷的检测准确率提升 22%;YOLOv10 提出的 C2fC 模块与 RepC_SPELAN4 结构,是针对特征融合与卷积效率的突破性设计,掌握它们,你就能让自己的 YOLOv11 模型在精度与速度的平衡上实现“质的飞跃”。别再让“模型精度不足”成为你的瓶颈——现在就动手修改代码,让你的 YOLOv11 模型在特征提取与检测效率上实现质的飞跃,用技术实力证明你的 AI 研发能力!中的卷积层为 RepC_SPELAN4。

m0_71589036的博客 97

文件I/O-002.lseek空洞文件

/* 制造空洞文件,空洞的部分写为0 od -c file.hole od观察文件的实际内容,od -c 以字符形式打印 */ #include #include #include #include char buf1[]="abcdefghij"; char buf2[]="ABCDEFGHIJ"; int main() { int fd; fd=open("file.hole

Pris_oner的博客 369

华为OD机试真题 新系统2026-04-15 Java&Go 实现【小猫钓鱼纸牌游戏】

有两名玩家甲和乙,他们玩一种“小猫钓鱼”扑克牌游戏。扑克牌为A、2、3、....J、Q、K,不考虑花色都用1-13来表示,然后给甲,乙两人各发n张牌,按给定顺序排成队列,这些牌背面朝上,正面朝下放置,队列的第一个元素是背面的第一张牌。 游戏规则如下:

MISAYAONE的博客 352

慢慢欣赏linux 文件黑洞和文件空洞

文件黑洞:/dev/null可以吞噬一切东东 文件空洞:文件系统的hole可以不占用磁盘空间 linux 黑洞文件详解 http://blog.51cto.com/study2008/1784434 linux下文件大小不一致的情况分析,文件空洞 http://blog.51cto.com/drizzlewalk/425473 linux下文件的大小到底多大 https://www.cnb...

shipinsky的博客 3762

行为预测模型:Social LSTM与Graph Neural Networks

行为预测模型:Social LSTM与Graph Neural Networks ,人工智能,计算机视觉,大模型,AI,本文围绕行为预测模型Social LSTM与Graph Neural Networks展开,介绍了两者的基础概念、原理、应用场景,还对比了它们在优势、劣势和适用场景上的不同,最后给出了相应的代码示例。Social LSTM基于LSTM,通过社交池化层处理多智能体交互;图神经网络处理图结构数据,靠消息传递获取信息,二者各有侧重,适用于不同场景。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 15万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

MySQL浅析之空间回收(4)

MySQL浅析之空间回收 1. 前言 我们在日常使用MySQL中,可能会发现这么个问题: 当我们数据库占用空间太大时,我们把一个最大的表的数据删了一半,可是表文件的大小还是没变。 我们就来聊聊表的空间回收:(默认讨论使用的是InnoDB引擎) 在一个表中包含两个部分,分别为表结构定义和数据。在MySQL 8.0版本以前,表结构是存在以.frm为后缀的文件里。而MySQL 8.0版本,则已经允许把表结构定义放在系统数据表中了。因为表结构定义占用的空间很小,所以我们主要是看表数据。 2. 参数innodb_fi

ZeroWdd的博客 557

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

3个步骤轻松管理空洞骑士模组:Scarab让你的游戏体验提升10倍![特殊字符]

还在为空洞骑士模组管理而头疼吗?每次安装新模组都要手动处理依赖关系、担心版本冲突导致游戏崩溃?Scarab——这款专为空洞骑士设计的智能模组管理器,将彻底改变你的游戏体验!无论你是刚接触模组的新手,还是追求极致体验的老玩家,Scarab都能让你在几分钟内完成原本需要数小时的模组配置工作。 ## 🔍 为什么你需要Scarab? 想象一下这样的场景:你发现了一个超酷的空洞骑士新模组,兴奋地下载后

gitblog_00880的博客 271

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

jffs2文件系统浅析----第二章从文件创建到flash固化存储

在第一章中我们讲述了jffs2文件系统如何通过文件ino信息找到flash中对应文件的数据实体,本章将与各位探讨下如何将文件固化到flash中存储。

牧羊人的博客 539

通过.ibd文件浅析InnoDB中一张表的主键索引B+树结构

定义 三个问题 解决问题一 py_innodb_page_info工具 hexdump核对 解决问题二 解决问题三 小结 定义 引用自《MySQL技术内幕:InnoDB存储引擎》第5.4.1节 InnoDB存储引擎表示索引组织表,即表中数据按照主键顺序存放。而聚集索引就是按照每张表的主键构造一棵B+树,同时叶子节点中存放的即为整张表的行记录数据,也将聚集索引的叶子节点称为数据页。聚集索引的这个特性决定了索引组织表中数据也是索引的一部分。同B+数据结构一样,每个数据页都通过一个双向链表来进行链接。由于实.

简单点 2674

keepalived源码浅析——Daemon进程

守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程常常在系统引导装入时启动,在系统关闭时终止。Linux系统有很多守护进程,大多数服务都是通过守护进程实现的,同时,守护进程还能完成许多系统任务,例如,作业规划进程crond、打印进程lqd等(这里的结尾字母d就是Daemon的

wdt3385的专栏 2873

KVM磁盘格式浅析

qemu-img支持非常多种的文件格式,可以通过qemu-img -h查看其命令帮助得到,它支持20多种格式:vvfat vpc vmdk vhdx vdi ssh sheepdog rbd raw host_cdrom host_floppy host_device file qed qcow2 qcow parallels nbd iscsi gluster dmg tftp ftps ftp https http cloop bochs blkverify blkdebug等,但我们实际常用的也就是.

格子的博客 1万+

Linux虚拟内存组织结构浅析(二)

Linux虚拟内存组织结构浅析(二)在前一篇文章中我们介绍了Linux虚拟内存在逻辑上的组织结构,现在就让我们从源代码入手,从程序级仔细看看各个数据结构体的内部组成如何,源代码来自于最新的kernel2.6.26.5,分析过程中主要参考了《Understanding the linux virtual memory》这本书,有兴趣的朋友可以去阅读一下。 一、节点的数据表示在内核中,

gxfan的专栏 4238

Linux内存管理浅析(一)

1.Linux内存管理的主要内容 a.虚拟内存管理 b.内核空间内存管理 c.用户空间内存管理 2.虚拟内存和物理内存映射 ZONE_HIGHMEM的主要作用:通过非永久映射实现内核对896M之外的物理内存的访问,比如:实际物理内存为4G,内核直接映射了896M,之外的897M-4G内核都无法访问是无法接受的。 3.内核内存管理的目标...

RopenYuan的专栏 366

daemon 头文件_linux下的daemon进程

#include int daemon(int nochdir,int noclose)在创建精灵进程的时候,往往需要将精灵进程的工作目录修改为"/"根目录并且将标准输入,输出和错误输出重定向到/dev/nulldaemon的作用就是当参数nochdir为0时,将根目录修改为工作目录noclose为0时,做输入,输出以及错误输出重定向到/dev/null执行成功返回0错误返回-1浅析daemon精...

weixin_34283655的博客 274

LingBot-Depth深度补全实战:如何提升深度传感器数据质量

本文介绍了如何在星图GPU平台上一键自动化部署LingBot-Depth镜像,实现深度传感器数据的高质量补全。该技术能有效修复深度图中的空洞与噪声,提升机器人导航、三维重建等应用的感知精度与可靠性,适用于自动驾驶、AR/VR及三维建模等多种视觉任务。

weixin_42452924的博客 142

linux 管理内存,Linux内存管理浅析(一)

ZONE_HIGHMEM的主要作用:通过非永久映射实现内核对896M之外的物理内存的访问,比如:实际物理内存为4G,内核直接映射了896M,之外的897M-4G内核都无法访问是无法接受的。 3.内核内存管理的目标a.最小化管理内存所需的时间b.最大化用于一般应用的可用内存4.内存分页:连续内存和分散内存的取舍Linux内核管理物理内存是通过分页机制实现的,它将整个内存划分成无数个4k(在i386体...

weixin_35947010的博客 245
上一篇: 单例模式
下一篇: 服务器稳定性测试方法汇总
baobao44199
博客等级 码龄15年 8粉丝 19原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值