跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C 语言信号处理
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
Admin
(
留言
|
贡献
)
2025年4月29日 (二) 04:45的版本
(Page creation by admin bot)
(差异) ←上一版本 |
已核准修订
(
差异
) |
最后版本
(
差异
) |
下一版本→
(
差异
)
警告:您正在编辑该页面的旧版本。
如果您发布该更改,该版本后的所有更改都会丢失。
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{DISPLAYTITLE:C语言信号处理}} == 简介 == '''信号处理'''是C语言标准库(<code><signal.h></code>)提供的一种进程间通信机制,允许操作系统或用户进程向目标进程发送异步事件通知。信号可以用于处理异常、中断请求或实现简单的进程控制。在UNIX/Linux系统中,信号是系统级事件的基本通知方式。 信号处理的核心功能包括: * 发送信号(如通过<code>kill()</code>系统调用) * 捕获并自定义信号处理行为 * 忽略或恢复默认信号行为 == 信号类型 == 常见标准信号(定义在<code><signal.h></code>中): {| class="wikitable" |+ 标准信号列表(部分) ! 信号名 !! 值 !! 描述 |- | <code>SIGINT</code> || 2 || 终端中断(如Ctrl+C) |- | <code>SIGSEGV</code> || 11 || 无效内存访问 |- | <code>SIGTERM</code> || 15 || 终止请求 |- | <code>SIGALRM</code> || 14 || 定时器超时 |} == 基本用法 == === 信号处理函数 === 使用<code>signal()</code>函数注册信号处理器: <syntaxhighlight lang="c"> #include <stdio.h> #include <signal.h> #include <unistd.h> void handler(int sig) { printf("Received signal: %d\n", sig); } int main() { signal(SIGINT, handler); // 注册SIGINT处理器 while(1) { printf("Running...\n"); sleep(1); } return 0; } </syntaxhighlight> '''输出示例''': <pre> Running... Running... ^CReceived signal: 2 # 用户按下Ctrl+C Running... ... </pre> === 高级信号处理 === 更安全的<code>sigaction()</code>函数: <syntaxhighlight lang="c"> struct sigaction sa; sa.sa_handler = handler; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; sigaction(SIGINT, &sa, NULL); </syntaxhighlight> == 实际案例 == === 定时器实现 === 使用<code>SIGALRM</code>创建简单定时器: <syntaxhighlight lang="c"> #include <signal.h> #include <unistd.h> #include <stdio.h> void alarm_handler(int sig) { printf("Timer expired!\n"); } int main() { signal(SIGALRM, alarm_handler); alarm(5); // 设置5秒定时器 pause(); // 等待信号 return 0; } </syntaxhighlight> === 多线程信号处理 === 在多线程程序中,信号处理需特别注意: <syntaxhighlight lang="c"> pthread_sigmask(SIG_BLOCK, &mask, NULL); // 阻塞信号 // 创建线程... pthread_sigmask(SIG_UNBLOCK, &mask, NULL); // 在主线程处理信号 </syntaxhighlight> == 信号处理流程 == <mermaid> flowchart TD A[信号产生] --> B{信号处理方式} B -->|默认| C[执行系统默认操作] B -->|忽略| D[丢弃信号] B -->|自定义| E[调用用户处理函数] E --> F[处理函数返回后恢复执行] </mermaid> == 数学基础 == 信号处理涉及中断概率计算。假设信号到达服从泊松分布: <math> P(k) = \frac{\lambda^k e^{-\lambda}}{k!} </math> 其中: * <math>\lambda</math>为单位时间平均信号数 * <math>k</math>为实际到达信号数 == 注意事项 == 1. 信号处理函数应是可重入的(避免使用非异步安全函数如<code>printf()</code>) 2. 某些信号(如<code>SIGKILL</code>)不能被捕获或忽略 3. 信号可能中断系统调用(需检查<code>errno == EINTR</code>) == 扩展阅读 == * UNIX信号机制发展历史 * 实时信号(<code>SIGRTMIN</code>到<code>SIGRTMAX</code>) * 信号与进程状态的关系 [[Category:C语言标准库]] [[Category:系统编程]] [[Category:编程语言]] [[Category:C]] [[Category:C 语言标准库]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)