
编程语言语言运行时标准库垃圾回收并发编程【免费下载链接】cangjie_runtime仓颉编程语言运行时与标准库。项目地址https://gitcode.com/Cangjie/cangjie_runtime点击查看免费下载导读本文深入剖析仓颉Cangjie标准库std.runtime包中的Signal信号类围绕其类定义、六个预定义信号常量SIGHUP、SIGINT、SIGQUIT、SIGTRAP、SIGALRM、SIGTERM、value只读属性与init构造函数展开并结合仓库源码揭示信号注册、分发链路runtime_signal.cj→CJ_MCC_AddSignalHandler→SignalManager→SignalStack的底层实现。读完本文你将能够在仓颉程序中正确创建与读取信号对象并与registerSignalHandler、unregisterSignalHandler、resetSignalHandler等 API 配合完成进程信号的捕获与处理。Signal 类概览Signal类位于仓颉标准库std.runtime包中其官方 API 文档见 runtime_package_class.md完整实现位于 runtime_signal.cj。public class Signal { public static const SIGHUP Signal(0x1, hangup) public static const SIGINT Signal(0x2, interrupt) public static const SIGQUIT Signal(0x3, quit) public static const SIGTRAP Signal(0x5, trace/breakpoint trap) public static const SIGALRM Signal(0xe, alarm clock) public static const SIGTERM Signal(0xf, terminated) public const init(value: Int32, comment: String) }功能信号类用于向操作系统、其他进程或进程自身传递事件的通知。注意Signal类及其全部成员均不支持 Windows 平台。从源码看runtime_signal.cj 中Signal类的每个成员都使用When[os ! Windows]条件编译注解修饰这与文档中不支持平台Windows的说明完全一致。同时该文件在构建层面也做了平台裁剪——stdlib/libs/std/runtime/CMakeLists.txt中runtime_signal.cj仅在CANGJIE_CODEGEN_CJNATIVE_BACKENDcjnative 后端开启时才被编入标准库。成员构成Signal类由三类成员组成成员类别说明SIGHUP/SIGINT/SIGQUIT/SIGTRAP/SIGALRM/SIGTERMpublic static const六个预定义信号常量valuepublic prop只读获取信号值init(value: Int32, comment: String)public const init创建信号支持自定义信号源码中Signal类内部实际由两个私有字段承载数据let _value: Int32与let _comment: String构造函数将参数存入这两个字段value属性通过 getter 返回_value。值得说明的是comment字段当前没有对应的公开访问属性仅作为信号的描述性注释存储。六个预定义信号常量Signal类为开发者预置了六个最常用的 POSIX 信号每个常量都是一个Signal实例其value与标准信号编号一一对应常量值十进制/十六进制注释典型语义SIGHUP10x1hangup终端挂起或进程父进程退出SIGINT20x2interrupt用户中断通常为 CtrlCSIGQUIT30x3quit用户退出通常为 Ctrl\SIGTRAP50x5trace/breakpoint trap调试断点触发SIGALRM140xealarm clock定时器超时SIGTERM150xfterminated终止请求kill 默认信号static const SIGALRMpublic static const SIGALRM Signal(0xe, alarm clock)功能SIGALRM 信号定时器超时。类型Signal。注意不支持平台Windows。示例import std.runtime.* main() { // 使用预定义的SIGALRM信号 println(SIGALRM信号值: ${Signal.SIGALRM.value}) return 0 }运行结果SIGALRM信号值: 14static const SIGHUPpublic static const SIGHUP Signal(0x1, hangup)功能SIGHUP 信号终端挂起或进程父进程退出。类型Signal。注意不支持平台Windows。示例import std.runtime.* main() { // 使用预定义的SIGHUP信号 println(SIGHUP信号值: ${Signal.SIGHUP.value}) return 0 }运行结果SIGHUP信号值: 1static const SIGINTpublic static const SIGINT Signal(0x2, interrupt)功能SIGINT 信号表示用户中断。类型Signal。注意不支持平台Windows。示例import std.runtime.* main() { // 使用预定义的SIGINT信号 println(SIGINT信号值: ${Signal.SIGINT.value}) return 0 }运行结果SIGINT信号值: 2static const SIGQUITpublic static const SIGQUIT Signal(0x3, quit)功能SIGQUIT 信号表示用户退出。类型Signal。注意不支持平台Windows。示例import std.runtime.* main() { // 使用预定义的SIGQUIT信号 println(SIGQUIT信号值: ${Signal.SIGQUIT.value}) return 0 }运行结果SIGQUIT信号值: 3static const SIGTERMpublic static const SIGTERM Signal(0xf, terminated)功能SIGTERM 信号终止请求。类型Signal。注意不支持平台Windows。示例import std.runtime.* main() { // 使用预定义的SIGTERM信号 println(SIGTERM信号值: ${Signal.SIGTERM.value}) return 0 }运行结果SIGTERM信号值: 15static const SIGTRAPpublic static const SIGTRAP Signal(0x5, trace/breakpoint trap)功能SIGTRAP 信号调试断点触发。类型Signal。注意不支持平台Windows。示例import std.runtime.* main() { // 使用预定义的SIGTRAP信号 println(SIGTRAP信号值: ${Signal.SIGTRAP.value}) return 0 }运行结果SIGTRAP信号值: 5prop value获取信号值public prop value: Int32功能获取信号的值。类型为 Int32。注意不支持平台Windows。示例import std.runtime.* main() { // 获取预定义信号的值 let signalValue Signal.SIGTERM.value println(SIGTERM信号的值: ${signalValue}) // 创建自定义信号并获取值 let customSignal Signal(15, my custom signal) println(自定义信号的值: ${customSignal.value}) return 0 }运行结果SIGTERM信号的值: 15 自定义信号的值: 15从源码看value是仓颉的只读属性仅含get()不含set()直接返回构造时存入_value字段的值因此信号对象一经创建其信号值便不可再变更。这在语义上是合理的信号编号应保持稳定避免注册后值被篡改导致分发错乱。init(Int32, String)创建信号public const init(value: Int32, comment: String)功能创建信号。注意不支持平台Windows。参数value: Int32 - 信号值。comment: String - 信号描述。示例import std.runtime.* main() { // 创建一个自定义信号 let customSignal Signal(10, custom signal) println(创建的信号值: ${customSignal.value}) return 0 }运行结果创建的信号值: 10init为const构造函数不可变对象构造这在源码runtime_signal.cj中表现为构造函数体仅做字段赋值无任何可变状态。预定义的六个常量全部通过该构造函数创建例如Signal(0x2, interrupt)对应值 2 的 SIGINT。自定义信号的实用场景预定义常量覆盖了最常用的六个信号但 POSIX 信号远不止这些。当需要处理SIGUSR1值 10、SIGUSR2值 12、SIGPIPE值 13等未预置的信号时可以直接通过构造函数创建自定义Signal实例例如 runtime_package_funcs.md 中的官方示例即用Signal(signal, custom)signal 取 10 表示 SIGUSR1完成注册。因此init构造函数是信号处理体系向任意可捕获信号扩展的入口。信号处理函数链与 Signal 的配合使用Signal对象通常作为参数传给std.runtime包的三个信号管理函数详见 runtime_package_funcs.mdregisterSignalHandler(sig: Signal, handler: SignalHandlerFunc): Unit注册信号处理函数。同一个信号可注册多个函数信号触发时按先进先出FIFO策略执行处理函数返回true则停止后续函数执行否则继续。unregisterSignalHandler(sig: Signal, handler: SignalHandlerFunc): Unit取消注册指定的处理函数。resetSignalHandler(sigs: ArraySignal): Unit清空指定信号传空数组则清空全部的已注册函数。其中SignalHandlerFunc定义为(Int32) - Bool的函数类型别名见 runtime_package_types.md。这三个函数在源码 runtime_signal.cj 中均有对应实现且都依赖Signal.value作为索引定位注册槽位因此Signal对象的value是信号处理链的核心键值。注册与信号分发的完整调用链registerSignalHandler的注册逻辑如下runtime_signal.cj校验信号值sig.value必须在 131 之间MAX_SIG_NUM 32否则抛出IllegalArgumentException在SignalManager.sigSlot一个按信号值索引的ArrayListSignalHandlerFunc数组中定位槽位加Mutex锁后若该槽位为空则调用regSigChain通过 foreign 函数CJ_MCC_AddSignalHandler将 Cangjie 侧处理函数链挂入运行时去重后把新的 handler 追加到槽位列表末尾。信号实际到达时运行时侧的处理链按反向注册顺序执行SignalStack.cpp 中SignalStack::HandlerImpl会逆序遍历当前信号的 handler 栈逐个调用处理函数若某个处理函数返回true则停止后续执行——这与最后一个函数返回false则继续执行信号默认行为的语义一致可参考 runtime_sample.md 中返回true与全部返回false两种场景的运行结果对比。底层CJ_MCC_AddSignalHandler/CJ_MCC_RemoveSignalHandler的 C 实现位于 CompilerCalls.cpp它们进一步委托给运行时SignalManager::AddHandlerToSignalStack见 SignalManager.cpp将用户 handler 追加进对应信号的SignalStack处理链。此外该实现还对信号做了特殊处理SIGPIPE 默认被屏蔽用户注册 handler 时会解除屏蔽见 CompilerCalls.cppSIGABRT、SIGILL 在用户注册 handler 后会由同步处理切换为异步处理见 SignalStack.cpp。使用注意事项综合官方文档与源码使用Signal类及其关联的信号处理 API 时需注意以下约束平台限制Signal类及所有信号处理 API 均不支持 Windows源码中全部以When[os ! Windows]条件编译保护。信号编号范围仅支持前 31 个可被捕获的非实时信号值 131超出范围如值 0 或 ≥32会抛出IllegalArgumentException。不支持的信号暂不支持 SIGBUS、SIGFPE、SIGSEGV 等中断信号这类信号由运行时内部保留用于崩溃诊断与栈回溯可参见 SignalManager.cpp 中运行时自行安装的HandleUnexpectedSignal处理器。handler 限制SignalHandlerFunc暂不支持成员函数和 foreign 函数。返回值语义处理函数返回true表示已处理该信号并停止后续函数执行若全部处理函数均返回false则继续执行该信号的默认行为例如 SIGQUIT 的默认行为是终止进程并产生 core dump。GC 与并发安全信号处理函数执行于运行时派发的任务中注册/注销操作通过Mutex保证线程安全见 runtime_signal.cj 的mtx定义。总结Signal类是仓颉std.runtime包信号处理体系的基石六个预定义常量覆盖了进程生命周期中最常见的控制信号value属性提供只读的信号编号访问init构造函数则允许开发者自由创建自定义信号以覆盖SIGUSR1、SIGPIPE等更多场景。配合registerSignalHandler/unregisterSignalHandler/resetSignalHandler函数即可在纯仓颉代码中构建线程安全、支持多回调链的信号捕获机制。其底层通过 foreign 函数与运行时SignalManager、SignalStack衔接体现了标准库 API 与运行时实现的清晰分层。赞分享编程语言语言运行时标准库垃圾回收并发编程【免费下载链接】cangjie_runtime仓颉编程语言运行时与标准库。项目地址https://gitcode.com/Cangjie/cangjie_runtime点击查看免费下载相关推荐Ant Design Form 组件完全指南数据域管理、表单校验与实战进阶Ant Design Form 组件完全指南数据域管理、表单校验与实战进阶 导读 本文以 Ant Designantd表单体系为线索系统讲解 Form编程语言语言运行时标准库垃圾回收并发编程gsd-core 里程碑归档安全防护--help/-h 如何被拦截为只读操作fail-closed 双层防线gsd core 里程碑归档安全防护 help/ h 如何被拦截为只读操作fail closed 双层防线 本篇技术指南聚焦 gsd core 中一个容易文档知识库教程OpenHarmony仓颉 BigInt 基本属性详解sign 与 bitLen 的语义、示例与底层原理仓颉 BigInt 基本属性详解sign 与 bitLen 的语义、示例与底层原理 BigInt 是仓颉 std.math.numeric 包提供的任意精度有文档知识库教程OpenHarmony创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考