<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Signal on 我的技术博客</title><link>https://buvidk1234.github.io/tags/signal/</link><description>Recent content in Signal on 我的技术博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 18 Aug 2026 00:16:00 +0800</lastBuildDate><atom:link href="https://buvidk1234.github.io/tags/signal/index.xml" rel="self" type="application/rss+xml"/><item><title>Go Runtime（七）：Signal与cgo线程管理</title><link>https://buvidk1234.github.io/posts/go-runtime-07-signal-cgo/</link><pubDate>Tue, 18 Aug 2026 00:16:00 +0800</pubDate><guid>https://buvidk1234.github.io/posts/go-runtime-07-signal-cgo/</guid><description>&lt;blockquote&gt;
&lt;p&gt;本文源码基线为 &lt;strong&gt;Go 1.26.2、Linux/amd64&lt;/strong&gt;。Signal 的编号、trampoline 和上下文结构具有平台差异；本文只把 Unix/Linux 主线作为具体实现，Windows 异常和 IOCP 回调需要单独对照平台文件。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;信号和 cgo 都会打破普通 Go 调用链的假设：信号可以在任意指令附近异步到达，C 代码可能阻塞、修改线程状态，甚至从一个非 Go 创建的线程回调 Go。&lt;/p&gt;
&lt;p&gt;runtime 必须在这些边界上重新建立可识别的线程、栈和执行现场，同时避免在不安全上下文中执行分配、加锁或调度操作。&lt;/p&gt;
&lt;h2 id="signal承担哪些职责"&gt;Signal承担哪些职责&lt;/h2&gt;
&lt;p&gt;Go runtime 使用或处理信号的目的并不相同：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;把 &lt;code&gt;SIGINT&lt;/code&gt;、&lt;code&gt;SIGTERM&lt;/code&gt; 等转交给 &lt;code&gt;os/signal&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;将某些同步 fault 转换为 Go panic。&lt;/li&gt;
&lt;li&gt;用异步信号抢占长时间运行的 goroutine。&lt;/li&gt;
&lt;li&gt;采样 &lt;code&gt;SIGPROF&lt;/code&gt; 生成 CPU profile。&lt;/li&gt;
&lt;li&gt;在 cgo 场景与 C 安装的 handler 协作。&lt;/li&gt;
&lt;li&gt;对致命信号打印 traceback 并退出。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因此不能笼统地说“Go 捕获了信号”。同一个 handler 入口会根据 signal 类型、发生线程和当前 G/M 状态走不同分支。&lt;/p&gt;
&lt;h2 id="sigtable描述策略"&gt;sigtable描述策略&lt;/h2&gt;
&lt;p&gt;runtime 为平台信号维护一张策略表，描述信号的默认行为和处理属性。概念上包括：&lt;/p&gt;
&lt;details class="code-fold" open&gt;
&lt;summary&gt;TEXT&lt;/summary&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;是否通知用户层
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;是否默认忽略
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;是否导致 panic
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;是否打印 stack
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;是否导致进程退出
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;是否属于同步 fault&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;p&gt;策略还会受程序是否导入 &lt;code&gt;os/signal&lt;/code&gt;、是否使用 cgo、signal disposition 是否被外部代码修改等因素影响。&lt;/p&gt;</description></item></channel></rss>