2015-10-19 48 views
2

我在内核中有一个模块,其中在特定事件/计数中,我想唤醒用户线程,它将通过proc fs从内核模块读取一些数据。什么是从内核模块触发用户线程的最佳方式

我试图从内核模块发送一个RT信号给处于睡眠状态的用户线程。该信号将调用其处理程序,并将进一步从内核读取数据/缓冲区并将其存储到文件中。

我正在面对一些未知的问题,使用这种方法后,发送信号系统被绞死,一切都停止。

请告诉我,如果我使用正确的方法(使用信号)从内核模块触发用户线程。如果它是正确的,那么锁定问题的根本原因是什么。

是否有任何连击方式可用于实现此功能...请建议/帮助。

内核模块:

static int send_signal(int data) 
{ 
    int ret; 
    struct siginfo info; 
    struct task_struct *t; 

    /* send the signal */ 
    memset(&info, 0, sizeof(info)); 
    /* I have tried 44 and 30 but both are not working */ 
    info.si_signo = sig_num; 
    info.si_code = SI_QUEUE; 
    info.si_int = data; 

    if (!g_user_pid) { 
     printk("error seding signal, pid is not configured"); 
     return -EAGAIN; 
    } 

    rcu_read_lock(); 
    t = pid_task(find_pid_ns(g_user_pid, &init_pid_ns), PIDTYPE_PID); 
    if (t == NULL) { 
     printk("invalid pid\n"); 
     rcu_read_unlock(); 
     return -EAGAIN; 
    } 

    printk("sending value %u to pid %d\n", info.si_int, (int)t->pid); 
    ret = send_sig_info(sig_num, &info, t); /* send the signal */ 
    rcu_read_unlock(); 

    if (ret < 0) { 
     printk("error sending signal\n"); 
     return ret; 
    } 
} 

PS:我是从中断上下文此功能。

回答

1

另一种方法是通过内核模块创建设备文件。从该文件读取被阻止,直到驱动程序放入数据。在这种情况下,用户空间应用程序可以打开并读取设备文件数据,而无需任何睡眠和捕捉信号。

更新:Here你可以找到创建只读设备文件的示例。您应该在hello_read_proc()中添加等待逻辑,这会生成读取块。

+0

谢谢! 你能解释一下如何实现这样的事情。或分享一个链接了解此.. –

+0

@PankajGupta解释如何从头开始做这将需要一本书或更多。我建议你拿一本关于编写Linux设备驱动程序的书。 – msw

相关问题