Re: Signals/ Communication from kernel to user!

From: Der Herr Hofrat
Date: Mon Feb 28 2005 - 14:20:36 EST


>
>
> Hello,
> We wanted to establish a communication from kernel module (possibly a
> driver) to a user level process.
>
> Wanted to know whether signals can be used for this purpose OR there any
> other (better) methods of communication??
>
a bit brute force but you can simply run through the task list and kick
the pid of your user-space app (example for 2.4 kernel):

hofrat

---snip---
/*
* Copywrite 2002 Der Herr Hofrat
* License GPL V2
* Author der.herr@xxxxxxx
*/
/*
* run through the task list of linux search for the passed pid and send it
* a SIGKILL . run as insmod pid=# to send process with pid # a kill signal
*/

#include <bits/signum.h> /* signal number macros SIGHUP etc. */
#include <linux/kernel.h> /* printk level */
#include <linux/module.h> /* kernel version etc. */
#include <linux/sched.h> /* task_struct */

MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("Der Herr Hofrat");
MODULE_DESCRIPTION("Signal to a user-space app from a kernel module");

int pid=0;
MODULE_PARM(pid,"i");

int
ksignal(int pid,int signum)
{
struct task_struct *p;

/* run through the task list of linux until we find our pid */
for_each_task(p){
if(p->pid == pid){
printk("sending signal %d for pid %d\n",signum,(int)p->pid);
/* don't have a sig_info struct to send along - pass 0 */
return send_sig(signum,p,0);
}
}
/* did not find the requested pid */
return -1;
}

int
init_module(void)
{
/* send pid a SIGKILL */
ksignal(pid,SIGKILL);
return 0;
}

void
cleanup_module(void)
{
printk("out of here\n");
}
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/