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

21-结构体siginfo_t

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

10.6.1 结构体siginfo_t

siginfo_t结构体也是在<sys/signal.h>中定义的,如下:

504.png 这种结构中都是传递给信号处理程序的信息(如果你使用sa_sigaction代替sa_sighandler)。在现代计算技术中,许多人认为UNIX信号模型是一种非常糟糕的实现IPC(进程间通信)的方法。这很有可能是因为当他们应该使用sigaction()和SA_SIGINFO时,这些人仍然坚持使用signal()。siginfo_t结构为我们打开了方便之门,在信号之上又衍生了大量的功能。

在这个结构体中,有许多有趣的数据,包括发送信号进程的信息,以及信号产生的原因。以下是对每个字段的详细描述:

si_signo

指定信号的编号。在你的信号处理程序中,第一个参数也提供了该信息(避免使用一个复引用的指针)。

si_errno

如果是非零值,表示与该信号有关的错误代码。该域对所有的信号都有效。

si_code

解释进程为什么收到信号以及信号由哪(例如,来自kill())发出。我们会在下一部分浏览一下可能的值。该域对所有的信号都有效。

si_pid

对于SIGCHLD,表示终止进程的PID。

si_uid

对于SIGCHLD,表示终止进程自己的UID。

si_status

对于SIGCHLD,表示终止进程的退出状态。

si_utime

对于SIGCHLD,表示终止进程消耗的用户时间。

si_stime

对于SIGCHLD,表示终止进程消耗的系统时间。

si_value

si_int和si_ptr的联合。

si_int

对于通过sigqueue()发送的信号(见本章稍后的“发送带附加信息的信号”),以整数类型作为参数。

si_ptr

对于通过sigqueue()发送的信号(见本章稍后的“发送带附加信息的信号”),以void指针类型作为参数。

si_addr

对于SIGBUS、SIGFPE、SIGILL、SIGSEGV和SIGTRAP,该void指针包含了引发错误的地址。例如对于SIGSEGV,该域包含非法访问内存的地址(因此常常是NULL)。

si_band

对于SIGPOLL,表示si_fd中列出的文件描述符的带外和优先级信息。

si_fd

对于SIGPOLL,表示操作完成的文件描述符。

si_value、si_int和si_ptr是非常的复杂,因为进程可以用它们给另一个进程传递任何数据。因此,你可以用它们发送一个整数或一个指向数据结构的指针(注意,如果进程不共享地址空间,那么指针是没有用的)。在接下来的10.6.3节中,将会讨论这些字段。

POSIX只保证前三个字段对于所有信号都是有效的。其他的字段只有在处理相应的信号时才会被访问。例如,只有当信号是SIGPOLL时,才可以访问si_fd字段。