为什么 sigaction 处理程序中的上下文是一个空指针?
Why is context in sigaction handler a void pointer?
在 sigaction(2)
手册页中:
The siginfo_t argument to a SA_SIGINFO handler
When the SA_SIGINFO flag is specified in act.sa_flags, the signal
handler address is passed via the act.sa_sigaction field. This han‐
dler takes three arguments, as follows:
void
handler(int sig, siginfo_t *info, void *ucontext)
{
...
}
为什么 ucontext 是 void *
,而手册页指出它是 ucontext_t *
?
ucontext
This is a pointer to a ucontext_t structure, cast to void *.
The structure pointed to by this field contains signal context
information that was saved on the user-space stack by the ker‐
nel; for details, see sigreturn(2). Further information about
the ucontext_t structure can be found in getcontext(3). Com‐
monly, the handler function doesn't make any use of the third
argument.
POSIX 实际上要求这是一个 void *
,sigaction
的第三个参数是:
void(*) (int, siginfo_t *, void *)
此外,由于 void *
可以自由转换为任何其他类型的数据指针,因此没有理由 不 在某些情况下使用一般情况将来您可能希望在其中无缝添加不同的类型。
在 sigaction(2)
手册页中:
The siginfo_t argument to a SA_SIGINFO handler
When the SA_SIGINFO flag is specified in act.sa_flags, the signal
handler address is passed via the act.sa_sigaction field. This han‐
dler takes three arguments, as follows:
void
handler(int sig, siginfo_t *info, void *ucontext)
{
...
}
为什么 ucontext 是 void *
,而手册页指出它是 ucontext_t *
?
ucontext
This is a pointer to a ucontext_t structure, cast to void *.
The structure pointed to by this field contains signal context
information that was saved on the user-space stack by the ker‐
nel; for details, see sigreturn(2). Further information about
the ucontext_t structure can be found in getcontext(3). Com‐
monly, the handler function doesn't make any use of the third
argument.
POSIX 实际上要求这是一个 void *
,sigaction
的第三个参数是:
void(*) (int, siginfo_t *, void *)
此外,由于 void *
可以自由转换为任何其他类型的数据指针,因此没有理由 不 在某些情况下使用一般情况将来您可能希望在其中无缝添加不同的类型。