C语言高级信号编程实战(sigaction配置全解析)

Linux 系统编程:从 signal 到 sigaction —— 进阶信号捕捉指南 本文对比了Linux信号处理中signal()与sigaction()函数的区别,重点介绍了sigaction的高级特性。signal函数简单但存在兼容性问题,而sigaction通过struct sigaction结构体提供了更精细的控制,特别是sa_mask字段可在信号处理期间临时屏蔽指定信号。文章通过一个实验案例演示了该特性:在处理SIGINT信号时屏蔽SIGQUIT,防止处理过程被中断。最后总结了两个函数的核心差异,指出sigaction在工业级开发中的优势,包括精确的信号屏蔽控制和自动防重入机制。 阅读详情

第一章:C语言信号处理概述

在操作系统中,信号是一种用于通知进程发生某种事件的机制。C语言通过标准库提供了对信号的处理支持,允许程序响应如中断、异常、定时器超时等系统级事件。信号处理是编写健壮系统程序的重要组成部分,尤其在服务器、守护进程和嵌入式系统中广泛应用。

信号的基本概念

信号是异步通知机制,由内核或进程发送给目标进程。每个信号都有唯一的整数编号和对应的宏名称,例如 SIGINT(2)表示中断信号,通常由用户按下 Ctrl+C 触发。 常见的标准信号包括:
  • SIGTERM:请求终止进程
  • SIGKILL:强制终止进程(不可捕获或忽略)
  • SIGSEGV:访问非法内存地址
  • SIGALRM:定时器超时信号

信号的处理方式

进程可以为大多数信号设置自定义处理函数,或选择默认行为、忽略信号。使用 signal() 函数注册信号处理器:
#include <signal.h>
#include <stdio.h>
#include <unistd.h>

// 自定义信号处理函数
void handle_sigint(int sig) {
    printf("捕获到中断信号 %d,正在安全退出...\n", sig);
}

int main() {
    // 注册 SIGINT 的处理函数
    signal(SIGINT, handle_sigint);

    printf("等待信号(尝试按下 Ctrl+C)...\n");
    while(1) {
        sleep(1); // 持续运行等待信号
    }
    return 0;
}
上述代码中,当用户按下 Ctrl+C 时,不再执行默认的终止操作,而是调用 handle_sigint 函数输出提示信息。

信号处理注意事项

信号处理函数应尽量简洁,仅调用异步信号安全函数(如 write、_exit),避免使用 printf、malloc 等非安全函数,以防引发未定义行为。
信号名默认动作是否可捕获
SIGINT终止是
SIGKILL终止否
SIGSEGV终止(核心转储)是

第二章:sigaction结构体深度解析

2.1 sigaction结构体成员详解与作用域分析

在Linux信号处理机制中,`sigaction`结构体用于精确控制信号的行为。其定义如下:

struct sigaction {
    void     (*sa_handler)(int);
    void     (*sa_sigaction)(int, siginfo_t *, void *);
    sigset_t   sa_mask;
    int        sa_flags;
    void     (*sa_restorer)(void);
};
其中,`sa_handler`用于指定传统信号处理函数,而`sa_sigaction`在启用`SA_SIGINFO`标志时提供更丰富的上下文信息。`sa_mask`定义了处理信号期间需阻塞的额外信号集,确保关键代码段的原子性。
成员作用域与线程安全性
`sa_mask`和`sa_flags`的作用域限于当前线程,不同线程可独立设置同一信号的响应方式。`sa_flags`支持`SA_RESTART`、`SA_NODEFER`等选项,影响系统调用重启行为和信号自动解阻。
成员作用作用域
sa_handler/sa_sigaction信号处理入口进程级共享,线程可覆盖
sa_mask临时阻塞信号集线程局部
sa_flags行为控制标志线程局部

2.2 sa_handler与sa_sigaction的选用场景对比实践

在信号处理中,sa_handler和sa_sigaction是sigaction结构体中的两个互斥成员,分别适用于不同复杂度的信号处理场景。
基础信号处理:使用sa_handler
适用于只需响应信号而无需额外上下文信息的简单场景。

struct sigaction sa;
sa.sa_handler = simple_handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sigaction(SIGINT, &sa, NULL);
该方式仅传递信号编号,适合处理如SIGINT、SIGTERM等常规中断。
高级信号处理:使用sa_sigaction
当需要获取信号产生原因或上下文(如寄存器状态)时,必须使用sa_sigaction,并设置SA_SIGINFO标志。

void advanced_handler(int sig, siginfo_t *info, void *context) {
    printf("Signal from PID: %d\n", info->si_pid);
}
// ...
sa.sa_sigaction = advanced_handler;
sa.sa_flags = SA_SIGINFO;
此时内核通过第三个参数传递ucontext_t,可用于调试或恢复执行状态。
特性sa_handlersa_sigaction
参数数量13
适用标志无SA_SIGINFOSA_SIGINFO
使用复杂度低高

2.3 信号掩码sa_mask的配置策略与并发控制实例

在多信号并发环境中,`sa_mask` 字段用于指定在信号处理函数执行期间需要额外屏蔽的信号集,防止重入和资源竞争。
sa_mask 的配置原则
合理设置 `sa_mask` 可避免多个相关信号同时触发导致的状态紊乱。通常应将可能干扰当前处理流程的信号加入掩码。
代码示例:阻塞特定信号

struct sigaction sa;
sigemptyset(&sa.sa_mask);
sigaddset(&sa.sa_mask, SIGUSR1); // 阻塞SIGUSR1
sa.sa_handler = handler;
sigaction(SIGINT, &sa, NULL);
该配置确保在处理 `SIGINT` 时,`SIGUSR1` 被临时阻塞,直到处理完成。
并发控制场景
  • 多个信号共享临界资源时,利用 sa_mask 实现串行化访问
  • 避免异步信号处理中全局变量的脏读写

2.4 sa_flags标志位全解析:从SA_RESTART到SA_SIGINFO实战应用

在信号处理中,`sa_flags` 是 `struct sigaction` 中的关键字段,用于控制信号行为的底层细节。
常用标志位详解
  • SA_RESTART:自动重启被中断的系统调用,避免因信号导致 read/write 等调用失败返回 EINTR。
  • SA_NODEFER:在信号处理期间不自动阻塞同类型信号,可用于递归触发场景。
  • SA_SIGINFO:启用扩展信号处理函数,支持携带附加信息的 `siginfo_t` 参数。
SA_SIGINFO 实战代码

struct sigaction sa;
sa.sa_sigaction = handler;  // 使用 sa_sigaction 而非 sa_handler
sa.sa_flags = SA_SIGINFO;
sigemptyset(&sa.sa_mask);
sigaction(SIGUSR1, &sa, NULL);

void handler(int sig, siginfo_t *info, void *context) {
    printf("Received signal from PID: %d\n", info->si_pid);
}
该代码注册一个带上下文信息的信号处理器。当使用 `kill -SIGUSR1` 发送信号时,`info->si_pid` 可获取发送进程的 PID,适用于进程间通信调试。
标志位组合应用场景
结合 SA_SIGINFO 与 SA_NODEFER,可实现高并发信号处理逻辑,如实时监控系统中的异步事件注入。

2.5 结构体初始化最佳实践与常见陷阱规避

使用字段名显式初始化
在 Go 中推荐使用字段名进行结构体初始化,避免因字段顺序变更导致的潜在错误。
type User struct {
    ID   int
    Name string
    Age  int
}

u := User{
    ID:   1,
    Name: "Alice",
}
该方式明确指定字段值,即使后续添加新字段或调整结构体定义,也能保证兼容性。未显式赋值的字段(如 Age)将自动初始化为零值。
避免零值依赖陷阱
注意区分显式赋值与隐式零值。例如布尔类型字段若未赋值,默认为 false,可能引发业务逻辑误判。建议通过构造函数封装初始化逻辑:
  • 确保关键字段必填
  • 统一默认值处理
  • 提升代码可维护性

第三章:信号安装与处理函数注册

3.1 使用sigaction()安全注册信号处理器的完整流程

在Linux系统编程中,`sigaction()` 提供了比 `signal()` 更可靠和可移植的信号处理机制。它允许精确控制信号的行为,避免竞态条件和不可预期的中断。
关键结构与函数调用

struct sigaction sa;
sa.sa_handler = handler_func;  // 指定处理函数
sigemptyset(&sa.sa_mask);     // 初始化屏蔽信号集
sa.sa_flags = SA_RESTART;      // 系统调用被中断时自动重启
sigaction(SIGINT, &sa, NULL);   // 注册SIGINT处理
该代码片段设置了一个安全的信号处理器。`sa_mask` 可添加额外信号,在处理期间阻塞;`SA_RESTART` 防止系统调用被中断后返回错误。
核心优势对比
特性signal()sigaction()
可移植性弱强
原子性保障无有
标志控制受限精细

3.2 信号处理函数的设计原则与异步安全性验证

在编写信号处理函数时,必须遵循异步信号安全(async-signal-safe)原则,确保仅调用可重入或由 POSIX 明确允许的函数。
异步安全函数限制
信号处理函数中禁止调用如 printf、malloc 等非异步安全函数,否则可能导致死锁或内存损坏。推荐使用 write 替代标准 I/O 函数:
void handler(int sig) {
    const char msg[] = "Received SIGINT\n";
    write(STDERR_FILENO, msg, sizeof(msg) - 1);
}
该代码直接使用系统调用 write,避免依赖可能被中断的标准库状态。
信号处理设计准则
  • 仅使用异步信号安全函数
  • 避免访问静态或全局非 volatile 变量
  • 通过 sig_atomic_t 通信主流程
通过有限操作与主循环协作,可实现可靠、可预测的信号响应机制。

3.3 对比signal()函数:为何sigaction更适用于生产环境

在信号处理机制中,`signal()` 函数虽然简单易用,但其行为在不同系统平台上存在差异,不具备可移植性。相比之下,`sigaction` 提供了更精确和可靠的控制能力。
核心优势对比
  • 可指定信号处理期间阻塞哪些信号(通过 sa_mask)
  • 明确控制是否自动重启被中断的系统调用(sa_flags)
  • 行为标准化,符合 POSIX 规范,保证跨平台一致性

struct sigaction sa;
sa.sa_handler = handler_func;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART; // 自动重启中断的系统调用
sigaction(SIGINT, &sa, NULL);
上述代码注册 SIGINT 处理函数,sa_flags 设置为 SA_RESTART 可避免系统调用被意外中断。而 signal() 无法保证此行为,在高并发服务中可能导致状态不一致或资源泄漏,因此 sigaction 更适合生产环境使用。

第四章:高级信号控制与实战案例

4.1 实现可重入信号处理程序以避免竞态条件

在多线程或异步信号触发环境中,信号处理程序若访问共享资源,可能因不可重入导致竞态条件。使用可重入函数是确保信号安全的关键。
可重入函数特性
  • 不依赖全局或静态数据
  • 所有数据均来自局部变量
  • 调用的函数也必须是可重入的
示例:安全的信号处理

#include <signal.h>
void handler(int sig) {
    sig_atomic_t val = 1; // 唯一可异步安全修改的类型
    __sync_synchronize(); // 内存屏障确保可见性
}
该代码使用 sig_atomic_t 类型保证原子读写,配合内存屏障防止指令重排,确保信号处理中状态一致性。
常见非可重入函数
函数风险原因
malloc修改堆管理结构
printf使用内部缓冲区

4.2 结合pause()与sigprocmask()实现精确信号同步

在多进程协作中,精确控制信号的接收时机至关重要。通过 `sigprocmask()` 可以临时阻塞指定信号,确保关键代码段不被中断,随后使用 `pause()` 主动等待被阻塞的信号解除并捕获。
信号同步的基本流程
  • 调用 sigprocmask() 阻塞特定信号,防止过早响应
  • 执行临界区操作,确保状态一致
  • 调用 pause() 挂起进程,直到信号到达并被处理

sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGUSR1);
sigprocmask(SIG_BLOCK, &set, NULL); // 阻塞SIGUSR1

// 执行关键操作
printf("Critical section...\n");

signal(SIGUSR1, handler);
sigprocmask(SIG_UNBLOCK, &set, NULL); // 解除阻塞
pause(); // 等待信号
上述代码中,sigprocmask() 确保 SIGUSR1 不会在准备完成前到达,而 pause() 提供了低开销的等待机制,避免轮询。这种组合实现了高效、可靠的进程间同步。

4.3 多进程环境下SIGCHLD的可靠回收机制设计

在多进程服务模型中,子进程终止后若未及时回收,将形成僵尸进程。通过捕获 SIGCHLD 信号并正确调用 waitpid() 可实现资源清理。
信号处理与非阻塞回收
需在信号处理函数中循环回收所有已终止的子进程,避免因信号合并导致漏回收:

void sigchld_handler(int sig) {
    pid_t pid;
    int status;
    while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
        printf("Child %d exited\n", pid);
    }
}
signal(SIGCHLD, sigchld_handler);
上述代码中,waitpid(-1, ..., WNOHANG) 非阻塞地回收任意子进程,WNOHANG 防止挂起主流程。循环确保批量回收,提升可靠性。
常见陷阱与规避策略
  • 仅调用一次 waitpid() 可能遗漏多个退出子进程
  • 使用 signal() 而非 sigaction() 可能在部分系统上重置信号处理函数

4.4 守护进程中信号的优雅退出与资源清理方案

在守护进程运行过程中,操作系统信号是控制其生命周期的关键机制。为实现优雅退出,需捕获中断信号并执行资源释放逻辑。
信号监听与处理
通过监听 SIGINT 和 SIGTERM 信号,触发退出流程:
signalChan := make(chan os.Signal, 1)
signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)
<-signalChan
// 执行清理逻辑
该代码创建一个带缓冲的信号通道,注册两个常用终止信号。接收到信号后,程序继续执行后续清理操作。
资源清理策略
常见需释放的资源包括:
  • 关闭网络监听套接字
  • 提交或回滚数据库事务
  • 关闭日志文件句柄
  • 通知子进程安全终止
结合超时机制可避免阻塞:
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
// 在规定时间内完成清理

第五章:总结与进阶学习路径

持续构建云原生技能体系
现代后端开发已深度融入云原生生态。掌握 Kubernetes 自定义控制器开发是提升系统扩展性的关键一步。例如,使用 Operator SDK 编写 Go 语言控制器时,可监听自定义资源状态变化并执行自动化操作:

func (r *MyAppReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
    var myapp MyApp
    if err := r.Get(ctx, req.NamespacedName, &myapp); err != nil {
        return ctrl.Result{}, client.IgnoreNotFound(err)
    }
    
    // 确保 Deployment 按 spec 部署
    desired := generateDeployment(&myapp)
    if err := r.Create(ctx, desired); err != nil && !errors.IsAlreadyExists(err) {
        return ctrl.Result{}, err
    }
    return ctrl.Result{Requeue: true}, nil
}
性能调优实战策略
高并发场景下,数据库连接池配置直接影响服务稳定性。以下为 PostgreSQL 在 GORM 中的推荐配置:
参数建议值说明
MaxOpenConns50-100根据数据库实例规格调整
MaxIdleConns10避免过多空闲连接消耗资源
ConnMaxLifetime30m防止连接老化导致的超时
可观测性体系建设
通过 OpenTelemetry 统一采集日志、指标与追踪数据,可显著提升故障排查效率。在 Go 服务中集成 Jaeger 追踪的典型步骤包括:
  • 引入 opentelemetry-go 和 jaeger-exporter 依赖
  • 初始化 TracerProvider 并注册 Jaeger Exporter
  • 在 HTTP 中间件中注入 Span 上下文
  • 将 trace_id 输出到日志字段,实现跨系统关联分析
Linux 信号编程进阶:彻底搞懂 ​​sigaction​​ 与信号屏蔽特性 摘要:Linux系统编程中,sigaction是比signal()更可靠的信号处理机制。它通过struct sigaction结构体实现精细控制,包括自动屏蔽本信号(避免递归调用)和手动屏蔽其他信号(通过sa_mask)。文章通过代码实验验证了信号屏蔽特性:处理函数执行期间,重复信号会被推迟且不累积;手动屏蔽的信号会在处理结束后生效。关键点包括正确初始化结构体、理解临时/全局屏蔽范围,以及注意信号丢失问题。掌握sigaction对编写健壮的Linux程序至关重要。(149字) 阅读详情

相关推荐

C语言:高级并发操作(信号)

同步和异步的使用。异步事件处理的两种方法:查询法、通知法。(单核机器不存在异步)

m0_58233509的博客 1455

LINUX信号处理(sigaction信号捕获函数:struct sigaction)

一、函数结构 #include <signal.h> int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact); 参数: 参数1:要捕获的信号 参数2:接收到信号之后对信号进行处理的结构体 参数3:接收到信号之后,保存原来对此信号处理的各种方式与信号(可用来做备份)。如果不需要备份,此处可以填NULL 返回值: 成功时:返回0 出错时:返回-1,并将errno设置

qq_20853741的博客 2万+

【C语言】信号编程

c语言信号的使用signal函数sigaction函数 signal函数 使用signal函数方法是比较简单的,原型函数为: sighandler_t signal(int signum, sighandler_t handler); 信号接收到的信号数字,然后就执行函数handler。 使用kill -l查看命令的编号: asus@ubuntu:~/Desktop/c_file$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTR

afleshfish的博客 699

C语言高级信号编程(sigaction信号屏蔽全攻略)

掌握C语言sigaction的信号屏蔽技巧,深入解析信号处理机制,适用于多线程与高并发场景。详述sa_mask配置、原子化信号阻塞及避免竞态的关键方法,提升程序稳定性与可靠性,值得收藏。

FuncIsle的博客 1030

C语言:通过sigaction处理信号

sa_mask:定义一组信号,在调用由sa_handler所定义的处理器程序时将阻塞该组信号,不允许它们中断此处理器程序的执行。可以看到第二次的ctrl+c是在第一次ctrl+c处理完成后才被处理的,也就是信号在处理时把当前的信号阻塞住,直到处理完成。可以看到信号在第一次被处理时,第二次按的信号中断了第一次的信号处理,然后第二次信号处理完成后,第一次的信号处理恢复执行的。第一次接收到ctrl+c信号时,会调用sighandler,然后该函数将处理动作恢复为之前的动作。

风静如云的博客 338

机场数据治理系列介绍(1):机场行业数据中台中的数据管理顶层设计方案

民航机场行业的数据中台中,有关数据管理顶层设计方案需要结合机场行业的业务特点和技术需求进行具体的设计,今日我们简要考量设计提供一个参考方案:

机场信息系统研究员的专栏 1604

【C语言信号处理核心技术】:深入解析sigaction的信号屏蔽机制与实战应用

掌握C语言信号处理关键技巧,深入解析sigaction的信号屏蔽机制与应用方法。涵盖信号阻塞、原子操作及多线程安全场景,提升程序稳定性与响应能力。核心原理+实战代码演示,值得收藏。

ByteShoal的博客 1015

FLUENT UDF编译及蒸发冷凝相关问题

蒸发冷凝与相间传质

weixin_48029137的博客 1万+

c语言sigaction,c语言信号处理sigaction

c语言信号处理sigaction(2011-04-18 23:45:19)标签:c语言信号处理sigactionsighupit分类:c信号安装函数sigaction(int signum,const struct sigaction *act,struct sigaction*oldact)的第二个参数是一个指向sigaction结构的指针(结构体名称与函数名一样,千万别弄混淆了)。在结构sig...

weixin_26782843的博客 1364

axi ps读写pl_PL读写DDR:Datamover能干什么

最近发现工程项目中一直在用AXI-DMA。这玩意儿搬数据倒是没问题,就是用axi-lite配置起来非常反人类。。。简单的办法其实是用datamover ip核。这个ip核能干嘛呢。准备写个文章解析一下。由于好多feature没用过,所以仅仅看文档可能理解有误,欢迎指出错误。首先扫个盲:MM2S指的是Memory map to stream. 读DDR. S2MM指的是steam to memory...

weixin_35908791的博客 1597

向量库深度解析:选型、索引原理与生产实践

本文系统解析五大主流向量库(pgvector、Milvus、Weaviate、ChromaDB、Faiss)的定位、优缺点与适用场景,深入拆解FLAT、IVF、HNSW等核心索引原理,并重点分析Milvus的Compaction机制。针对数据治理场景,提供精准选型建议:中小规模优先pgvector或Weaviate,超大规模选择Milvus,开发测试推荐ChromaDB。核心索引推荐HNSW,兼顾检索速度与召回率。全文从理论到实践,为开发者提供清晰的向量库选型逻辑与生产落地指南。

a123147abc的博客 361

C 语言编程 — sigaction 信号处理

或者是特定的常量值,如果 sa_handler 指定为 SIG_IGN(忽略信号)或 SIG_DFL(采用默认操作),则 sa_sigaction 和 sa_restorer 字段将被忽略。字段是附加标志,可以用于控制 handler 的行为。例如:SA_RESTART 标志可以指定系统调用被信号中断后自动重启,从而避免了系统调用被中断而导致的错误。当 handler 运行时,该掩码用于阻止其他信号的干扰。字段指定了一个高级信号处理函数,可以获取有关信号的更多信息,如:信号来源,信号的时间戳等。

烟云的计算 2904

基于AUTOSAR的汽车电子项目--电动助力转向系统

基于AUTOSAR的汽车电子项目开发通常涵盖广泛的领域,例如动力系统控制、车身电子、信息娱乐系统、高级驾驶辅助系统(ADAS)等。以下是一个简化的示例项目,展示了如何在AUTOSAR环境下开发一个电动助力转向系统(Electric Power Steering, EPS)的控制软件

MHD0815的博客 2131

C语言信号编程精华(从入门到精通sigaction信号屏蔽)

掌握C语言sigaction的信号屏蔽技巧,解决多信号并发处理难题。详解信号阻塞、原子操作与结构体配置,适用于高可靠系统编程。深入解析sa_mask使用方法与安全机制,提升程序稳定性,值得收藏。

FastCompile的博客 424

遥感影像建筑物变化检测

遥感影像建筑物变化检测

yilvyangguang520的博客 423

高效计算斐波那契数列的C++实现及源码

斐波那契数列是一个非常经典的数学问题,通常递归方式计算斐波那契数列的时候会有很大的时间复杂度问题。首先,我们需要了解斐波那契数列的定义:斐波那契数列是指前两个数都为1,从第三个开始每个数都等于它前面两个数之和。因此,斐波那契数列的前几项为:1、1、2、3、5、8、13、21……在这个代码中,我们首先判断n是否特殊情况(即n等于0、1、2),然后通过循环计算得出对应的斐波那契数列值。通过这个例子,我们可以发现使用C++语言实现高效斐波那契数列计算的代码简单、易懂,并且时间复杂度相比递归方式有了很大的提升。

TechInk的博客 547

【C语言信号处理核心技术】:深入掌握sigaction配置的5大关键步骤

掌握C语言处理信号的sigaction配置,有效解决进程异步事件响应问题。涵盖信号捕捉、结构体设置、标志位应用等五大步骤,适用于后台服务与嵌入式开发,提升程序稳定性与可控性,值得收藏。

CompiLume的博客 1049

ThingsBoard教程(十六):RPC部件的使用

前言 各位读者好,截止目前,ThingsBoard系列文章已经做了十篇,分别是 ThingsBoard教程(一):ThingBoard介绍及安装 ThingsBoard教程(二):租户,租户配置,部件组模块的使用 ThingsBoard教程(三):系统设置模块的使用 ThingsBoard教程(四):规则链简介与操作 ThingsBoard教程(五):客户,资产管理 ThingsBoard教程(六):设备管理 ThingsBoard教程(七):模拟设备遥测 ThingsBoard教程(八):自定义UI T

知无涯 4580

【探索Linux】P.18(进程信号 —— 信号捕捉 | 信号处理 | sigaction() )

本文介绍了三个主题:信号捕捉、可重入函数与不可重入函数以及volatile关键字。在信号捕捉部分,讲解了内核实现信号捕捉的过程,并介绍了sigaction()函数的原型、参数、返回值以及使用方法。接着,文章对可重入函数和不可重入函数进行了对比,分别说明了它们的条件和特征。最后,提到了volatile关键字的作用。这些内容全面介绍了相关知识点,有助于读者理解和应用这些概念。

Yawesh的博客 4844

深度学习工具包 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")

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

实时系统中信号安全的关键:sigaction高级配置技巧大公开

掌握C语言处理信号的sigaction配置技巧,提升实时系统稳定性与响应精度。适用于高并发、低延迟场景,通过sa_flags设置与信号屏蔽精准控制行为,避免竞态条件。深入解析结构体配置与常见陷阱,值得收藏。

CompiGlow的博客 1048

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

[大师C语言(第三十六篇)]C语言信号处理:深入解析与实战

本文详细介绍了C语言信号处理的技术和方法,包括信号的基本概念、处理方式、信号集的使用以及多进程环境中的信号处理。通过这些信息,开发者可以更好地理解信号处理的工作原理,并在C语言程序中有效地使用信号。信号处理是操作系统中一个重要的概念,对于理解进程间通信和系统级编程至关重要。希望本文能够作为你在信号处理道路上的一个有用的指南。

极客代码 1539

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++使用sigaction实战

一点睛 sigaction:查询或设置信号处理方式 头文件 #include<signal.h> 定义函数 int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact); 函数说明 sigaction()会依参数signum指定的信号编号来设置该信号的处理函数。参...

实践求真知 3531

linux c编程信号处理的一些实例signal sigaction

linux c编程信号处理的一些实例signal sigaction 刚接触linux下的c编程,记录一下吧.对于信号,就是我们经常用的那个kill,kill可以发送很多信号,当然,我们也可以通过程序来实现,我们甚至可以来定义对于不同的信号的处理,比如ctrl+c可能并不能退出我们的程序,因为我们可以监视ctrl+c发送的SIGINT信号,并且用我们自己的功能来进行处理.PS:发现写代码也是个需

906

进程信号之sigaction系统调用

在执行sigaction设置的特定信号的处理函数期间,如果sigaction在为这个特定信号设置处理函数时设置阻塞了一些信号,那么这个被阻塞的信号如果在自定义函数执行期间产生了,则被挂起,当这个自定义函数执行完毕,这个被挂起的信号会被重新发给进程。前面提到Linux用数据结构sigset_t表示一组信号集,处在信号集中的信号,在执行sigaction捕捉的信号的对应自定义捕捉函数时,会阻塞。,通过简单学习一下signal来了解信号捕捉,然后自定义处理函数的大致逻辑。建议大家先看一下这篇文章。

2301_81570594的博客 1223
上一篇: 【C语言动态库版本兼容实战】:掌握跨版本无缝对接的5大核心技术
下一篇: Matplotlib 3D交互旋转全攻略(从入门到高手的必备技能)
deeplens
博客等级 码龄21年 176粉丝 2158原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值