struct siginfo {
int si_signo; /* signal number */
int si_errno; /* if nonzero, errno value from <errno.h> */
int si_code; /* additional info (depends on signal) */
pid_t si_pid; /* sending process ID */
uid_t si_uid; /* sending process real user ID */
void *si_addr; /* address that caused the fault */
int si_status; /* exit value or signal number */
long si_band; /* band number for SIGPOLL */
/* possibly other fields also */
};
我不明白si_band
。
答案 0 :(得分:1)
如果查看sigaction
的Linux联机帮助页,您会看到:
SIGPOLL/SIGIO
填写si_band
和si_fd
。si_band
事件有点掩盖 包含与poll(2)在revents字段中填充的值相同的值。si_fd
字段表示I / O事件的文件描述符 发生。
可以在链接的手册页中找到该位掩码的含义的解释 - 实质上,它告诉信号处理程序触发信号的事件类型(至少在Linux中,您还获得相应的文件描述符。)< / p>
我不确定这是多么便携。 si_band
似乎位于POSIX中,但不是si_fd
。参考:POSIX <signal.h>
,POSIX poll(2)
答案 1 :(得分:1)
进程可以请求SIGPOLL信号以实现异步I / O.来自man page of sigactions:
SIGPOLL
/SIGIO
填写si_band和si_fd。 si_band事件是一个 位掩码包含与revents字段中填充的值相同的值 通过民意调查(2)。
revents
描述了发生的事件的类型,并导致SIGPOLL
被发送。 man page of poll详细描述了它:
字段revents是一个输出参数,由内核填充 实际发生的事件。在revents中返回的位可以 包括:
POLLIN There is data to read.
POLLPRI
There is urgent data to read (e.g., out-of-band data on TCP
socket; pseudoterminal master in packet mode has seen state
change in slave).
POLLOUT
Writing now will not block.
POLLRDHUP (since Linux 2.6.17)
Stream socket peer closed connection, or shut down writing half
of connection. The _GNU_SOURCE feature test macro must be
defined (before including any header files) in order to obtain
this definition.
POLLERR
Error condition (output only).
POLLHUP
Hang up (output only).
POLLNVAL
Invalid request: fd not open (output only).