查看文章 |
struct sigaction
2007年06月14日 星期四 16:38
struct sigaction (k_sigaction.sigaction) struct k_sigaction { struct sigaction sa; }; 对于用户空间的头文件而言,struct sigaction定义在 /usr/include/bits/sigaction.h,此头文件又被/usr/include/signal.h包含,所以应用程序中如果用到此 结构,只要#include <signal.h>即可。注意内核中的定义和应用程序中的定义是不一样的,内核空间的sigaction结构只支持函数类型为 __sighandler_t的信号处理函数,不能处理信号传递的额外信息。 linux-2.6.12.1/include/asm-i386/signal.h ---------------------------------------------- #ifdef __KERNEL__ struct old_sigaction { __sighandler_t sa_handler; old_sigset_t sa_mask; unsigned long sa_flags; __sigrestore_t sa_restorer; }; struct sigaction { __sighandler_t sa_handler; unsigned long sa_flags; __sigrestore_t sa_restorer; sigset_t sa_mask; /* mask last for extensibility */ }; struct k_sigaction { struct sigaction sa; }; #else Here we must cater to libcs that poke about in kernel headers. 用户程序使用sigaction结构体时用这个声明,内核程序使用sigaction结构体时用上面那个声明 struct sigaction { union { __sighandler_t _sa_handler; void (*_sa_sigaction)(int, struct siginfo *, void *); } _u; sigset_t sa_mask; unsigned long sa_flags; void (*sa_restorer)(void); }; #define sa_handler _u._sa_handler #define sa_sigaction _u._sa_sigaction ---------------------------------------------- sigaction.sa_flags 控制内核对该信号的处理标记 SA_NODEFER 一般情况下, 当信号处理函数运行时,内核将阻塞<该给定信号 -- SIGINT>。但是如果设置了SA_NODEFER标记, 那么在该信号处理函数运行时,内核将不会阻塞该信号。 SA_NODEFER是这个标记的正式的POSIX名字(还有一个名字SA_NOMASK,为了软件的可移植性,一般不用这个名字) SA_RESETHAND 当调用信号处理函数时,将信号的处理函数重置为缺省值。 SA_RESETHAND是这个标记的正式的POSIX名字(还有一个名字SA_ONESHOT,为了软件的可移植性,一般不用这个名字) SA_SIGINFO 信号处理函数是带有三个参数的sa_sigaction sigaction.sa_mask 某信号(signum)的信号处理函数运行时阻塞的额外信号集合(该函数运行期间阻塞的信号集合)。当调用该信号处理函数时,阻塞信号的总集合将是由进程 信号掩码中的那些信号(task_struct.blocked)与act.sa_mask中的那些信号以及signum(如果清除了 SA_NODEFER)的并集构成 注: 阻塞的意思是延迟相应信号 |
最近读者: