Linux 内核态 与 用户态传递 实时信号
2013-06-28 15:00
393 查看
http://juckyjhon.blog.sohu.com/156355213.html
kernel: #include <linux/config.h> #include <linux/modversions.h> #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/signal.h> #include <linux/sched.h> #define SIG_MYINT 33 #define PS_PID 30 //the user process id static int mysig_init(void) { siginfo_t info; struct task_struct *p; info.si_signo = SIG_MYINT; info.si_code = -1;//__SI_RT; info.si_int = 0x8; read_lock(&tasklist_lock); for_each_task(p) { if (p->pid == PS_PID) { read_unlock(&tasklist_lock); goto find_ps; } } read_unlock(&tasklist_lock); printk("can't find the process <%d>, you should run it first! ", PS_PID); return -1; find_ps: printk("send signal to user space. "); send_sig_info(SIG_MYINT, &info, p); return 0; } static void mysig_exit(void) { printk("my signal test exit. "); } MODULE_LICENSE("GPL"); MODULE_AUTHOR("xxxx"); module_init(mysig_init); module_exit(mysig_exit); user: #include <stdio.h> #include <signal.h> #define SIG_MYINT 33 void my_handler(int signo, siginfo_t *info, void *context) { printf("signal number: signo = %d, info->si_signo = %d ", signo, info->si_signo); printf("info->si_int = %d ", info->si_int); } int main(int argc, char **argv) { struct sigaction new_sa; new_sa.sa_handler = my_handler; sigemptyset(&new_sa.sa_mask); new_sa.sa_flags = SA_RESTART | SA_SIGINFO; new_sa.sa_restorer = NULL; sigaction(SIG_MYINT, &new_sa, NULL); while (1) { pause(); } }
相关文章推荐
- Linux信号实践(3) --信号内核表示
- 深入理解Linux内核day10--信号
- u-boot与linux内核间的参数传递过程分析
- Linux内核--网络栈实现分析(七)--数据包的传递过程(下)
- linux每日一学-linux用户态与内核态(6)
- Linux用户态与内核态的交互
- Linux 用户态与内核态的交互
- Linux0.11内核--汇编和C语言混合编程之参数传递
- u-boot与linux内核间的参数传递过程分析
- BootLoader与Linux内核的参数传递
- Linux2.6内核进程调度系列--scheduler_tick()函数2.更新实时进程的时间片
- u-boot与linux内核间的参数传递过程分析
- linux用户态和内核态切换理解
- RTC 实时时钟驱动 - Linux内核之我的天下
- Linux内核源码分析--内核启动命令行的传递过程(Linux-3.0 ARMv7)
- linux 内核-信号-队列
- 对Linux用户空间与内核空间数据传递的几点理解和总结(ZZ)
- linux用实时信号发送数据
- Linux信号实践(3) --信号内核表示
- Linux内核的信号机制——怪胎