uc_mcontext 定义在哪里?

che*_*nwj 4 linux signals

sa_sigaction 的第三个参数是一个指向机器相关的指针struct ucontext,我想知道我可以从中转储什么struct ucontext

void (*sa_sigaction)(int signum, siginfo_t *info, void *ucontext)

struct ucontext {
        unsigned long     uc_flags;
        struct ucontext  *uc_link;
        stack_t           uc_stack;
        struct sigcontext uc_mcontext;
        sigset_t          uc_sigmask;   /* mask last for extensibility */
};
Run Code Online (Sandbox Code Playgroud)

特别是通过 uc_mcontext(如果你能告诉我在哪里我可以了解更多关于其他数据成员的信息,那就太好了),因为人们通常用来uc_mcontext像这样转储主机寄存器,

ucontext->uc_mcontext.gregs[REG_EIP]
Run Code Online (Sandbox Code Playgroud)

因为uc_mcontext类型是struct sigcontext,我看就struct sigcontextarch/x86/include/asm/sigcontext.h

struct sigcontext {
        unsigned short gs, __gsh;
        unsigned short fs, __fsh;
        unsigned short es, __esh;
        unsigned short ds, __dsh;

        ... snip ...
};
Run Code Online (Sandbox Code Playgroud)

它是正确的,怎么一回事,因为我看不到gregsstruct sigcontext?欢迎任何建议。

gby*_*gby 7

您正在查看 sigcontext 的 Linux 内核定义。您应该查看 struct ucontext 的 C 库头文件。它在 /usr/include/sys/ucontext.h 文件中定义

请注意,它是特定于体系结构的——例如,x86 和 PPC 的字段完全不同!