Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在同一项目中使用.sa_sigaction和.sa_handler(手册页说明)_Linux_Signals_Manpage_Sigaction - Fatal编程技术网

Linux 在同一项目中使用.sa_sigaction和.sa_handler(手册页说明)

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的手册页时,我偶然发现Linux手册页中有一条令人困惑的注释:

在某些体系结构中涉及联合:不要同时分配给这两个体系结构 sa_handler和sa_sigaction()

有两种可能的阅读方法:

  • 据我所知,这是否意味着不允许在同一个
    结构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);
    };
    
    因此,写入其中一个会覆盖另一个