SEO技术

SEO技术

Products

当前位置:首页 > SEO技术 >

如何高效地保存Linux信号处理结果?

96SEO 2026-02-19 23:52 13


href="https://www.cnblogs.com/ljbguanli/p/19621671"

如何高效地保存Linux信号处理结果?

title="发布于

aria-level="2">深入解析:Linux:信号保存下(信号二)

id="content_views">

欢迎回来,我们今天继续学习信号知识

书接上文,信号的产生除了上篇博客简绍的几种外,还有一些其他的,我们今天继续来探索

alt=""

src="https://i-blog.csdnimg.cn/direct/a3341d8889424d72b192d65da9ed4b20.png"

width="1079">

1.信号的产生(软件条件产生信号)

当我们在进行管道通信时,假如读端全部关闭,那么操作系统会将写端也关闭,这就是软件条件产生的信号

不过今天我们要简绍另一种软件条件产生的信号--alarm

alarm基础用法

alarm

这个函数的返回值是0或者是以前设定的闹钟时间还余下的秒数。

打个⽐⽅,某⼈要⼩睡⼀觉,设定闹钟为30分钟之后响,20分钟后被⼈吵醒了,还想多睡⼀会⼉,于是重新设定闹钟为15分钟之后响,“以前设定的闹钟时间还余下的时间”就是10分钟。

如果seconds值为0,表⽰取消以前设定的闹钟,函数的返回值仍然是以前设定的闹钟时间还余下的秒数

alt=""

src="https://i-blog.csdnimg.cn/direct/d4bf99e6cd2740babb18ff48735d0215.png"

width="1385">

下面我们来调用一下这个函数(程序的作⽤是1秒钟之内不停地数数,1秒钟到了就被SIGALRM信号终⽌,必要的时候,对SIGALRM信号进⾏捕捉):

}

src="https://i-blog.csdnimg.cn/direct/63a4a3baba5846deadca181fb5cbced1.png"

width="1878">

可以发现最后返回的是信号14

alt=""

src="https://i-blog.csdnimg.cn/direct/2c3f511412f248239e9373c1036f5906.png"

width="1099">

而14号信号就算SIGALRM

可是你或许有一个疑问,为什么这么慢呢,一秒的时间应该可以执行上亿次这样的操作呀,那是因为IO+网络操作(因为up使用的是云服务器)导致运行次数减少,下面我们可以改一下代码让你直观感受IO操作与网络操作效率上的影响

}*/

src="https://i-blog.csdnimg.cn/direct/454f4edc759b43389b5e71edef199e2f.png"

width="1673">

1s5亿多次才是我们所熟悉的速度嘛~~

alarm循环发送信号

那么如果我们想要alarm一直发送信号怎么办呢?

那么就要使用下面的代码了

}

src="https://i-blog.csdnimg.cn/direct/886440331b9544108f26523db7558cf0.png"

width="1626">

使用alarm完成类似操作系统做任务的功能

std::vector>

void

{v.push_back(Sched);v.push_back(MemManger);v.push_back(Fflush);signal(SIGALRM,

}

src="https://i-blog.csdnimg.cn/direct/355c79158e5a4a369642acb85ad05db2.png"

种触发来源

信号可通过以下场景产生:

  1. 键盘操作(如Ctrl+C触发

    SIGINT)

  2. 系统调用(如killraise等接口)
  3. 系统命令(如终端执行kill命令)
  4. 硬件异常(如内存越界触发

    SIGPIPE)

无论信号由哪种来源产生,信号的发送必须由操作系统(OS)完成,其底层本质是:修改目标进程在内核中对应的

“信号位图”(比特位),以此记录进程收到了该信号

2.信号的保存

1.为什么要保存

就像拿外卖一样,你不需要立马拿,但是你得知道他送到了,你不能忘了拿,进程也一样,接收到信号后不需要立马执行,但是进程需要记得有这个信号,需要记得之后处理这个信号

2.信号的保存流程

alt=""

src="https://i-blog.csdnimg.cn/direct/2a4e89bbb7fe412ebf2fafe0563bc9d2.png"

width="1077">

  • 信号递送(Delivery):是信号的

    “实际处理阶段”——

    当进程执行信号对应的处理动作(比如执行自定义函数、触发默认终止、选择忽略),这个过程被称为

    “信号递送”。

  • 信号未决(Pending):是信号从

    “产生”

    信号已经产生(操作系统已修改进程的信号位图标记该信号),但进程还未执行处理动作,对应图中

    “信号在位图中,还没来得及处理”

    某个信号:

    • 被阻塞的信号产生后,会一直保持未决状态(不会执行递送)
    • 只有当进程解除对该信号的阻塞,这个未决的信号才会被递送(执行处理动作)

    阻塞与忽略是不一样的

    • 阻塞:是

      信号一直停留在未决状态,根本不会进入递送阶段

    • 忽略:是

      信号已经完成递送,只是在处理时选择不执行任何操作

    信号产生后,会先进入未决状态(保存在进程的信号位图中)

    • 若该信号未被阻塞:进程会在安全时机执行信号递送,选择

      “自定义处理

      中的一种动作

    • 若该信号被阻塞:会一直保持未决状态,直到阻塞解除,才会触发递送流程

    3.底层信号保存的实现

    alt=""

    src="https://i-blog.csdnimg.cn/direct/74700f4c0b7f466c8701229d9e88a521.png"

    width="1807">

    这张图展示了Linux

    进程控制块(task_struct)关联的

    “三张表”(blockpendinghandler),它们通过位图

    数组形式,协同实现信号的阻塞、未决、处理逻辑:

    1.

    核心关联:task_struct与三张表

    task_struct是进程的控制块(记录进程所有状态),其中关联了信号管理的三张表,这三张表是内核管理信号的核心载体

    2.

    三张表的功能与规则

    (1)block表:信号阻塞位图

    • 类型unsigned

      int(位图结构),每一位对应一个信号(比特位位置

      信号编号,如第

      SIGINT)。

    • 功能:标记

      比特位内容为1表示阻塞该信号,0表示不阻塞。

    • 示例:图中

      SIGINT

      block位是1,说明该信号被进程阻塞;SIGHUP

      (1)

      block位是0,不阻塞。

    (2)pending表:信号未决位图

    • 类型unsigned

      int(位图结构),比特位位置对应信号编号。

    • 功能:标记

      “未决”

      状态(未执行处理),0表示无未决信号。

    • 示例:图中

      SIGINT

      pending位是1,说明该信号已被进程接收,但因被block阻塞,暂未执行处理(保持未决)。

    (3)handler表:信号处理函数数组

    • 类型sighandler_t

      handler[31](函数指针数组),数组下标对应信号编号。

    • 功能:定义信号的处理方式,每个元素对应一种动作:
      • SIG_DFL:执行信号的默认处理(如图中

        SIGHUP

        的处理方式)

      • SIG_IGN:忽略该信号(如图中

        SIGINT

        的处理方式)

      • 自定义函数指针:通过signal()系统调用注册的用户自定义处理函数(如图中

        SIGALRM

        handlerSig)绑定自定义函数)

    1. 信号产生后,内核将pending表中

      SIGINT

      对应的位设为1(标记未决);

    2. 检查block表:SIGINT

      对应的位是1(被阻塞),因此信号保持未决状态;

    3. 当进程解除

      SIGINT

      的阻塞(block位设为0),内核会读取handler表:SIGINT

      对应的处理方式是SIG_IGN,因此执行

      “忽略”

      动作,同时将pending位设为0(清除未决)。

    这三张表的配合,是

    Linux

    数组的轻量化结构,高效完成信号的状态管理

    4.sigset_t

    与信号集操作

    sigset_t

    Linux

    内核为进程信号管理设计的核心数据类型——

    “有效

    “未决信号集”

    从底层逻辑看,sigset_t

    “信号位图”

    的封装:

    • 阻塞信号集(信号屏蔽字)sigset_t

      bit

      不阻塞;

    • 未决信号集sigset_t

      bit

      无未决信号;

    • 无需关心sigset_t内部存储细节(不同系统实现不同),仅需通过专用函数操作即可。

    “基础工具”,必须先初始化再使用:

    函数功能
    sigemptyset(&set)初始化信号集,所有

    bit

    清零(无有效信号)

    sigfillset(&set)初始化信号集,所有

    bit

    1(包含系统所有信号)

    sigaddset(&set,

    sig)

    向信号集中添加指定信号sig(对应

    bit

    1)

    sigdelset(&set,

    sig)

    从信号集中删除指定信号sig(对应

    bit

    清零)

    sigismember(&set,

    sig)

    判断信号sig是否在信号集中(在→1,不在→0,出错→-1)

    核心注意:

    使用sigset_t必须先初始化sigemptyset/sigfillset),否则信号集状态不确定,操作会出问题

    1.

    表)

    sigprocmask是修改

    “阻塞信号集”

    的核心函数,参数how决定修改方式:

    how

    mask)

    SIG_BLOCK新屏蔽字

    mask

    set(添加阻塞信号)
    SIG_UNBLOCK新屏蔽字

    mask

    ~set(解除指定信号的阻塞)

    SIG_SETMASK新屏蔽字

    set(直接替换原有屏蔽字)

    2.

    表)

    sigpending能读取当前进程所有处于

    “未决状态”

    的信号,通过sigset_t传出

    rgba(0,

    sigpending(&pending);PrintPending(pending);

    0000

    old_block;////////屏蔽2号信号////////

    1//初始化sigemptyset(&block);sigemptyset(&old_block);sigaddset(&block,

    SIGINT);

    //此时并没有对2号信号进行屏蔽,因为我们只是在我们创造出来的block上进行操作int

    &block,

    //此时才屏蔽完毕//////////////////////////int

    cnt

    4while(true){//////获取pending信号集合/////

    2sigset_t

    sigpending(&pending);///恢复对2号信号对block的情况//

    5if

    std::endl;}//////打印pending信号集合/////

    3PrintPending(pending);sleep(1);cnt++;}//////////////////////////return

    }

    好啦,这就是关于信号产生与保存的内容啦,我们下一篇博客将进攻信号捕捉,也就是信号处理,敬请期待啦~~

class="post-meta-container">



SEO优化服务概述

作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。

百度官方合作伙伴 白帽SEO技术 数据驱动优化 效果长期稳定

SEO优化核心服务

网站技术SEO

  • 网站结构优化 - 提升网站爬虫可访问性
  • 页面速度优化 - 缩短加载时间,提高用户体验
  • 移动端适配 - 确保移动设备友好性
  • HTTPS安全协议 - 提升网站安全性与信任度
  • 结构化数据标记 - 增强搜索结果显示效果

内容优化服务

  • 关键词研究与布局 - 精准定位目标关键词
  • 高质量内容创作 - 原创、专业、有价值的内容
  • Meta标签优化 - 提升点击率和相关性
  • 内容更新策略 - 保持网站内容新鲜度
  • 多媒体内容优化 - 图片、视频SEO优化

外链建设策略

  • 高质量外链获取 - 权威网站链接建设
  • 品牌提及监控 - 追踪品牌在线曝光
  • 行业目录提交 - 提升网站基础权威
  • 社交媒体整合 - 增强内容传播力
  • 链接质量分析 - 避免低质量链接风险

SEO服务方案对比

服务项目 基础套餐 标准套餐 高级定制
关键词优化数量 10-20个核心词 30-50个核心词+长尾词 80-150个全方位覆盖
内容优化 基础页面优化 全站内容优化+每月5篇原创 个性化内容策略+每月15篇原创
技术SEO 基本技术检查 全面技术优化+移动适配 深度技术重构+性能优化
外链建设 每月5-10条 每月20-30条高质量外链 每月50+条多渠道外链
数据报告 月度基础报告 双周详细报告+分析 每周深度报告+策略调整
效果保障 3-6个月见效 2-4个月见效 1-3个月快速见效

SEO优化实施流程

我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:

1

网站诊断分析

全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。

2

关键词策略制定

基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。

3

技术优化实施

解决网站技术问题,优化网站结构,提升页面速度和移动端体验。

4

内容优化建设

创作高质量原创内容,优化现有页面,建立内容更新机制。

5

外链建设推广

获取高质量外部链接,建立品牌在线影响力,提升网站权威度。

6

数据监控调整

持续监控排名、流量和转化数据,根据效果调整优化策略。

SEO优化常见问题

SEO优化一般需要多长时间才能看到效果?
SEO是一个渐进的过程,通常需要3-6个月才能看到明显效果。具体时间取决于网站现状、竞争程度和优化强度。我们的标准套餐一般在2-4个月内开始显现效果,高级定制方案可能在1-3个月内就能看到初步成果。
你们使用白帽SEO技术还是黑帽技术?
我们始终坚持使用白帽SEO技术,遵循搜索引擎的官方指南。我们的优化策略注重长期效果和可持续性,绝不使用任何可能导致网站被惩罚的违规手段。作为百度官方合作伙伴,我们承诺提供安全、合规的SEO服务。
SEO优化后效果能持续多久?
通过我们的白帽SEO策略获得的排名和流量具有长期稳定性。一旦网站达到理想排名,只需适当的维护和更新,效果可以持续数年。我们提供优化后维护服务,确保您的网站长期保持竞争优势。
你们提供SEO优化效果保障吗?
我们提供基于数据的SEO效果承诺。根据服务套餐不同,我们承诺在约定时间内将核心关键词优化到指定排名位置,或实现约定的自然流量增长目标。所有承诺都会在服务合同中明确约定,并提供详细的KPI衡量标准。

SEO优化效果数据

基于我们服务的客户数据统计,平均优化效果如下:

+85%
自然搜索流量提升
+120%
关键词排名数量
+60%
网站转化率提升
3-6月
平均见效周期

行业案例 - 制造业

  • 优化前:日均自然流量120,核心词无排名
  • 优化6个月后:日均自然流量950,15个核心词首页排名
  • 效果提升:流量增长692%,询盘量增加320%

行业案例 - 电商

  • 优化前:月均自然订单50单,转化率1.2%
  • 优化4个月后:月均自然订单210单,转化率2.8%
  • 效果提升:订单增长320%,转化率提升133%

行业案例 - 教育

  • 优化前:月均咨询量35个,主要依赖付费广告
  • 优化5个月后:月均咨询量180个,自然流量占比65%
  • 效果提升:咨询量增长414%,营销成本降低57%

为什么选择我们的SEO服务

专业团队

  • 10年以上SEO经验专家带队
  • 百度、Google认证工程师
  • 内容创作、技术开发、数据分析多领域团队
  • 持续培训保持技术领先

数据驱动

  • 自主研发SEO分析工具
  • 实时排名监控系统
  • 竞争对手深度分析
  • 效果可视化报告

透明合作

  • 清晰的服务内容和价格
  • 定期进展汇报和沟通
  • 效果数据实时可查
  • 灵活的合同条款

我们的SEO服务理念

我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。

提交需求或反馈

Demand feedback