【问题标题】:Sending signal from kernel to user space [closed]从内核向用户空间发送信号[关闭]
【发布时间】:2011-04-12 11:32:02
【问题描述】:

如何从内核空间获取信号到用户空间?

【问题讨论】:

    标签: linux linux-device-driver embedded-linux


    【解决方案1】:

    要从内核获取信号到用户空间,请在您的用户空间和内核空间代码中使用以下代码,如下所示:

    用户空间应用:

    signal(SIGIO, &signal_handler_func); 
    fcntl(fd, F_SETOWN, getpid());
    oflags = fcntl(fd, F_GETFL);
    fcntl(fd, F_SETFL, oflags | FASYNC);
    

    定义signal_handler_func函数:

    void signal_handler_func (int sig)
    {
    
    //handle the action corresponding to the signal here
    }
    

    内核空间模块:

    int ret = 0;
    struct siginfo info;
    memset(&info, 0, sizeof(struct siginfo));
    info.si_signo = SIG_TEST;
    info.si_code = SI_QUEUE;
    info.si_int = 1234;  
    
    send_sig_info(SIG_TEST, &info, t);//send signal to user land 
    

    t 是用户应用程序的 PID。

    【讨论】:

    • 你能提供完整的例子吗?
    • 另外,我如何知道用户应用程序的 pid?
    • 用户空间应用程序可以在初始化时使用 netlink 套接字向模块注册,并且在注册消息中他们可以指定他们的 PID。
    • @dexterous_stranger 我这样做但使用kill_proc_info() 而不是send_sig_info()。您可以使用for_each_process() 宏通过名称查找进程并获取它的PID。
    【解决方案2】:

    使用内核API函数kill_proc_info(int sig, struct siginfo *info, pid_t pid)

    注意 这实际上是一个糟糕的答案。这些函数确实向用户空间发送信号,但正确的方法是这样做,因为询问者的意图是使用此处记录的 fasync 字符设备方法:http://www.xml.com/ldd/chapter/book/ch05.html#t4

    【讨论】:

    • #include #include #include int init_module() { // int i,res=0; // 字符 msg1[80];结构信号信息; printk(KERN_ALERT"\n 你好世界!!"); info.si_signo = 14; // 在这里给你信号号码!!!!!! info.si_errno = 0; info.si_code = SI_USER; info.si_pid = 当前->tgid; info.si_uid = 当前->uid; kill_proc_info(14, &info, 553);返回0; }void cleanup_module(){printk(KERN_ALERT"\n 再见世界!!");}MODULE_LICENSE("GPL");
    • 先生告诉我头文件是什么?
    • 内核 API 函数 kill_proc_info(int sig, struct siginfo *info, pid_t pid) 的头文件
    • 在执行我的程序时出现以下错误
    • /home/wasimtabrez/Work/int/signal2.c:在函数“init_module”中:/home/wasimtabrez/Work/int/signal2.c:24:错误:取消引用指向不完整类型的指针/ home/wasimtabrez/Work/int/signal2.c:25:错误:取消引用指向不完整类型的指针 /home/wasimtabrez/Work/int/signal2.c:27:错误:函数“kill_proc_info”的隐式声明 make [2]: *** [/home/wasimtabrez/Work/int/signal2.o] 错误 1 ​​make[1]: *** [_module_/home/wasimtabrez/Work/int] 错误 2 make[1]: 离开目录 `/usr /src/linux-headers-2.6.35-28-generic' make: *** [all] 错误 2
    【解决方案3】:

    有一种叫做 NetLink 接口的东西,它为内核进程和用户进程之间的通信提供了一组 API。它类似于套接字接口,通信是异步的,因此优于 IOCTL。

    此处概述:http://www.linuxjournal.com/article/7356

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-26
      • 2021-08-03
      • 2014-05-13
      • 2014-01-19
      • 1970-01-01
      相关资源
      最近更新 更多