当前位置:嗨网首页>书籍在线阅读

22-si_code的相关说明

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

10.6.2 si_code的相关说明

si_code字段说明信号发生的原因。对于用户发送的信号,该字段说明信号是如何被发送的。对于内核发送的信号,该字段说明信号发送的原因。

以下si_code值对任何信号都是有效的。它们说明了信号如何发送以及为何发送。

SI_ASYNCIO

由于完成异步I/O而发送该信号(见第5章)。

SI_KERNEL

信号由内核产生。

SI_MESGQ

由于一个POSIX消息队列的状态改变而发送该信号(不在本书的范围内)。

SI_QUEUE

信号由sigqueue()发送(见下一节)。

SI_TIMER

由于POSIX定时器超时而发送该信号(见第11章)。

SI_TKILL

信号由tkill()或tgkill()发送。这些系统调用是线程库使用的,不在本书的讨论范围内。

SI_SIGIO

由于SIGIO排队而发送该信号。

SI_USER

信号由kill()或raise()发送。

以下的si_code值只对SIGBUS有效。它们说明了发生硬件错误的类型:

BUS_ADRALN

进程发生了对齐错误(见第9章对对齐的讨论)。

BUS_ADRERR

进程访问无效的物理地址。

BUS_OBJERR

进程造成了其他类型的硬件错误。

对于SIGCHLD,以下值表示子进程给父进程发送信号时的行为:

CLD_CONTINUED

子进程被停止,但已经继续执行。

CLD_DUMPED

子进程非正常终止。

CLD_EXITED

子进程通过exit()正常终止。

CLD_KILLED

子进程被杀死了。

CLD_STOPPED

子进程被停止了。

CLD_TRAPPED

子进程进入一个陷阱。

以下值只对SIGFPE有效。它们说明了发生算术错误的类型:

FPE_FLTDIV

进程执行了一个除以0的浮点数运算。

FPE_FLTOVF

进程执行了一个会溢出的浮点数运算。

FPE_FLTINV

进程执行了一个无效的浮点数运算。

FPE_FLTRES

进程执行了一个不精确或无效结果的浮点数运算。

FPE_FLTSUB

进程执行了一个造成下标超出范围的浮点数运算。

FPE_FLTUND

进程执行了一个造成下溢的浮点数运算。

FPE_INTDIV

进程执行了一个除以0的整数运算。

FPE_INTOVF

进程执行了一个溢出的整数运算。

以下si_code值只对SIGILL有效。它们说明了执行非法指令的性质:

ILL_ILLADR

进程试图进入非法的寻址模式。

ILL_ILLOPC

进程试图执行一个非法的操作码。

ILL_ILLOPN

进程试图执行一个非法的操作数。

ILL_PRVOPC

进程试图执行特权操作码。

ILL_PRVREG

进程试图在特权寄存器上运行。

ILL_ILLTRP

进程试图进入一个非法的陷阱。

对于所有这些值,si_addr都指向非法操作的地址。

对于SIGPOLL,以下值表示形成信号的I/O事件:

POLL_ERR

发生了I/O错误。

POLL_HUP

设备挂起或套接字断开。

POLL_IN

文件有可读数据。

POLL_MSG

有个消息。

POLL_OUT

文件能够被写入。

POLL_PRI

文件有可读的高优先级数据。

以下的代码对SIGSEGV有效,描述了两种非法访问内存的类型:

SEGV_ACCERR

进程以无效的方式访问有效的内存区域,也就是说进程违反了内存访问的权限。

SEGV_MAPERR

进程访问无效的内存区域。

对于这两个值,si_addr包含了非法操作地址。

对于SIGTRAP,这两个si_code值表示陷阱的类型:

TRAP_BRKPT

进程“踩到”了一个断点。

TRAP_TRACE

进程“踩到”了一个追踪陷阱。

注意,si_code字段是个数值,而不是位。