Linux 在同一项目中使用.sa_sigaction和.sa_handler(手册页说明)
在查找sigaction的手册页时,我偶然发现Linux手册页中有一条令人困惑的注释: 在某些体系结构中涉及联合:不要同时分配给这两个体系结构 sa_handler和sa_sigaction() 有两种可能的阅读方法:Linux 在同一项目中使用.sa_sigaction和.sa_handler(手册页说明),linux,signals,manpage,sigaction,Linux,Signals,Manpage,Sigaction,在查找sigaction的手册页时,我偶然发现Linux手册页中有一条令人困惑的注释: 在某些体系结构中涉及联合:不要同时分配给这两个体系结构 sa_handler和sa_sigaction() 有两种可能的阅读方法: 据我所知,这是否意味着不允许在同一个结构sigaction中设置.sa_sigaction和.sa_handler 还是只允许在整个项目中使用.sa_sigaction或.sa_handler struct-sigaction-sigactionArray[SIGNAL\u-si
结构sigaction
中设置.sa_sigaction
和.sa_handler
.sa_sigaction
或.sa_handler
struct-sigaction-sigactionArray[SIGNAL\u-sigaction\u-ARRAY\u-SIZE]={
{.sa_handler=SIG_DFL,.sa_flags=sa_NODEFER},
{.sa_handler=SIG_DFL,.sa_flags=sa_NODEFER},
{.sa_handler=SIG_DFL,.sa_flags=sa_NODEFER},
{.sa_sigaction=HandleBacktraceSignals,.sa_flags=sa_SIGINFO | sa|u RESTART | sa|ONSTACK},
{.sa_sigaction=HandleBacktraceSignals,.sa_flags=sa_SIGINFO | sa|u RESTART | sa|ONSTACK},
{.sa_sigaction=HandleBacktraceSignals,.sa_flags=sa_SIGINFO | sa|u RESTART | sa|ONSTACK},
{.sa_sigaction=HandleBacktraceSignals,.sa_flags=sa_SIGINFO | sa|u RESTART | sa|ONSTACK},
{.sa_sigaction=HandleBacktraceSignals,.sa_flags=sa_SIGINFO | sa|u RESTART | sa|ONSTACK},
{.sa_handler=SIG_IGN,.sa_flags=sa_NODEFER},
{.sa_handler=SIG_IGN,.sa_flags=sa_NODEFER},
{.sa_sigaction=HandleBacktraceSignals,.sa_flags=sa_SIGINFO | sa|u RESTART | sa|ONSTACK},
{.sa_handler=SIG_IGN,.sa_flags=sa_NODEFER},
{.sa_sigaction=HandleBacktraceSignals,.sa_flags=sa_SIGINFO | sa|u RESTART | sa|ONSTACK},
{.sa_handler=SIG_DFL,.sa_flags=sa_NODEFER},
{.sa_handler=SIG_DFL,.sa_flags=sa_NODEFER},
{.sa_handler=SIG_IGN,.sa_flags=sa_NODEFER},
{.sa_handler=SIG_IGN,.sa_flags=sa_NODEFER},
{.sa_handler=SIG_DFL,.sa_flags=sa_NODEFER},
{.sa_handler=SIG_IGN,.sa_flags=sa_NODEFER},
{.sa_handler=SIG_DFL,.sa_flags=sa_NODEFER},
{.sa_handler=SIG_DFL,.sa_flags=sa_NODEFER},
{.sa_handler=SIG_DFL,.sa_flags=sa_NODEFER},
{.sa_handler=SIG_DFL,.sa_flags=sa_NODEFER},
{.sa_sigaction=HandleBacktraceSignals,.sa_flags=sa_SIGINFO | sa|u RESTART | sa|ONSTACK},
{.sa_sigaction=HandleBacktraceSignals,.sa_flags=sa_SIGINFO | sa|u RESTART | sa|ONSTACK},
{.sa_handler=SIG_DFL,.sa_flags=sa_NODEFER},
{.sa_handler=SIG_DFL,.sa_flags=sa_NODEFER},
{.sa_handler=SIG_IGN,.sa_flags=sa_NODEFER},
{.sa_handler=SIG_DFL,.sa_flags=sa_NODEFER},
{.sa_handler=SIG_DFL,.sa_flags=sa_NODEFER},
{.sa_sigaction=HandleBacktraceSignals,.sa_flags=sa_SIGINFO | sa|u RESTART | sa|ONSTACK}
};
根据解释1。上面的代码可以,但是当定义为2时。是的,这将是无效的,因为我混合
哪一个是真的?
注意:在我的体系结构中,它被定义为一个联合体,它只是在讨论相同的结构。它解释了原因:它们可能是
联合的一部分,因此它们在结构中使用相同的内存。例如,它实际上可能是这样的:
struct sigaction {
union {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
},
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
因此,写入其中一个会覆盖另一个