signal定义及处理

本文详细介绍了Linux支持的各种信号及其默认处理动作。包括POSIX.1、SUSv2中列出的信号,以及其他特定信号。还解释了如何使用signal系统调用来设置信号处理方式。

Linux支持的信号列表如下。很多信号是与机器的体系结构相关的,首先列出的是POSIX.1中列出的信号: 

信号 值 处理动作 发出信号的原因 
---------------------------------------------------------------------- 
SIGHUP 1 A 终端挂起或者控制进程终止 
SIGINT 2 A 键盘中断(如break键被按下) 
SIGQUIT 3 C 键盘的退出键被按下 
SIGILL 4 C 非法指令 
SIGABRT 6 C 由abort(3)发出的退出指令 
SIGFPE 8 C 浮点异常 
SIGKILL 9 AEF Kill信号 
SIGSEGV 11 C 无效的内存引用 
SIGPIPE 13 A 管道破裂: 写一个没有读端口的管道 
SIGALRM 14 A 由alarm(2)发出的信号 
SIGTERM 15 A 终止信号 
SIGUSR1 30,10,16 A 用户自定义信号1 
SIGUSR2 31,12,17 A 用户自定义信号2 
SIGCHLD 20,17,18 B 子进程结束信号 
SIGCONT 19,18,25 进程继续(曾被停止的进程) 
SIGSTOP 17,19,23 DEF 终止进程 
SIGTSTP 18,20,24 D 控制终端(tty)上按下停止键 
SIGTTIN 21,21,26 D 后台进程企图从控制终端读 
SIGTTOU 22,22,27 D 后台进程企图从控制终端写 

下面的信号没在POSIX.1中列出,而在SUSv2列出 

信号 值 处理动作 发出信号的原因 
-------------------------------------------------------------------- 
SIGBUS 10,7,10 C 总线错误(错误的内存访问) 
SIGPOLL A Sys V定义的Pollable事件,与SIGIO同义 
SIGPROF 27,27,29 A Profiling定时器到 
SIGSYS 12,-,12 C 无效的系统调用 (SVID) 
SIGTRAP 5 C 跟踪/断点捕获 
SIGURG 16,23,21 B Socket出现紧急条件(4.2 BSD) 
SIGVTALRM 26,26,28 A 实际时间报警时钟信号(4.2 BSD) 
SIGXCPU 24,24,30 C 超出设定的CPU时间限制(4.2 BSD) 
SIGXFSZ 25,25,31 C 超出设定的文件大小限制(4.2 BSD) 

(对于SIGSYS,SIGXCPU,SIGXFSZ,以及某些机器体系结构下的SIGBUS,Linux缺省的动作是A (terminate),SUSv2 是C (terminate and dump core))。 

下面是其它的一些信号 

信号 值 处理动作 发出信号的原因 
---------------------------------------------------------------------- 
SIGIOT 6 C IO捕获指令,与SIGABRT同义 
SIGEMT 7,-,7 
SIGSTKFLT -,16,- A 协处理器堆栈错误 
SIGIO 23,29,22 A 某I/O操作现在可以进行了(4.2 BSD) 
SIGCLD -,-,18 A 与SIGCHLD同义 
SIGPWR 29,30,19 A 电源故障(System V) 
SIGINFO 29,-,- A 与SIGPWR同义 
SIGLOST -,-,- A 文件锁丢失 
SIGWINCH 28,28,20 B 窗口大小改变(4.3 BSD, Sun) 
SIGUNUSED -,31,- A 未使用的信号(will be SIGSYS) 

(在这里,- 表示信号没有实现;有三个值给出的含义为,第一个值通常在Alpha和Sparc上有效,中间的值对应i386和ppc以及sh,最后一个值对应mips。信号29在Alpha上为SIGINFO / SIGPWR ,在Sparc上为SIGLOST。) 

处理动作一项中的字母含义如下 
A 缺省的动作是终止进程 
B 缺省的动作是忽略此信号 
C 缺省的动作是终止进程并进行内核映像转储(dump core) 
D 缺省的动作是停止进程 
E 信号不能被捕获 
F 信号不能被忽略



系统调用signal用来设定某个信号的处理方法。该调用声明的格式如下: 
void (*signal(int signum, void (*handler)(int)))(int); 
在使用该调用的进程中加入以下头文件: 
#include <signal.h>

在使用 **DC Compiler** 进行综合时,`set_dft_signal` 命令用于定义 DFT(Design For Test)相关的信号类型,例如扫描使能(scan enable)、测试模式(test mode)和时钟信号等。正确使用该命令可以确保综合工具识别 DFT 结构,并在后续的 ATPG(自动测试图形生成)流程中正确处理相关信号。 以下是一个典型的 `set_dft_signal` 命令语法: ```tcl set_dft_signal -view existing_dft -type [signal_type] [signal_name] ``` 其中,`[signal_type]` 可以是 `ScanClock`、`ScanEnable`、`TestMode` 等,具体取决于所要定义的 DFT 信号类型。例如,定义一个扫描时钟信号: ```tcl set_dft_signal -view existing_dft -type ScanClock [get_ports clk] ``` 该命令将端口 `clk` 标记为扫描链中的时钟信号,确保 DFT 工具在后续流程中正确识别该信号用于扫描移位操作[^4]。 当使用 `set_dft_signal` 定义时钟信号时,需要注意以下几点: - **确保信号已正确定义为时钟**:在使用 `set_dft_signal` 前,应使用 `create_clock` 或 `create_generated_clock` 明确指定该信号为时钟。例如: ```tcl create_clock -name clk -period 10 [get_ports clk] ``` - **检查信号驱动源**:确保 DFT 时钟信号的驱动逻辑不会被综合优化掉,必要时使用 `set_dont_touch` 或 `set_disable_timing` 命令保留相关逻辑。 - **避免信号类型冲突**:如果一个信号同时被定义为多个 DFT 类型(如既是扫描使能又是测试模式),应确保其逻辑功能不会导致冲突。 - **DFT 视图一致性**:`-view` 选项用于指定 DFT 视图,通常为 `existing_dft` 或 `dft_configuration`,确保与后续 DFT 插入流程一致。 此外,在使用 `set_dft_signal` 定义扫描使能信号时,示例命令如下: ```tcl set_dft_signal -view existing_dft -type ScanEnable [get_ports scan_enable] ``` 这将告诉综合工具 `scan_enable` 是控制扫描链切换的使能信号,确保在扫描测试期间该信号被正确控制。 在定义测试模式信号时,可使用: ```tcl set_dft_signal -view existing_dft -type TestMode [get_ports test_mode] ``` 该信号通常用于切换设计进入测试模式,以便进行功能测试或边界扫描。 ### 相关问题 1. 如何在 DC Compiler 中定义多个扫描链并指定各自的扫描使能信号? 2. 在使用 `set_dft_signal` 时,如何处理多时钟域设计中的 DFT 信号定义? 3. 如何验证 `set_dft_signal` 设置是否在综合后的网表中正确保留? 4. 在 DC Compiler 中如何结合 `create_clock` 和 `set_dft_signal` 来确保 DFT 时钟信号的完整性? 5. 使用 `set_dft_signal` 时,如何避免综合优化导致 DFT 信号被错误移除?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值