从内核发信号用户应用程序

时间:2013-07-17 03:09:50

标签: c linux-kernel signals

我一直在为真正奇怪的问题拉扯我的头发。内核模块无法在没有printk的情况下向用户应用程序发送信号(或用户应用程序无法接收),在发送信号之后或之前必须进行虚拟打印。

实际上,即使是空的printk也能很好地工作。但是,我想了解发生了什么。

有什么想法吗?

以下是发生的事情:

A - 内核) Char设备类型模块获得中断。

它提取数据并向用户发送信号。

/ *必须在这里做printk * /

返回IRQ句柄。

B-用户)

收到信号。

发出系统调用并从char设备的缓冲区中读取数据。 (copy_to_user)

内核:

void irq_handler(){
    int i;
    for(i =0; i < 32; i++) 
        GPIOdata[i] = read_gpio_status(i);

    struct task_struct *p = find_task_by_pid(processinfo.pid);
    if (NULL == p) 
        return;
    send_sig(SIGUSR1, p, 0);
    /* have to add printk here */
    return IRQ_HANDLED
}

用户:

void signal_handler(int sig) {
    char data[32];
    ioctl(fd, READ_Data_from_Char_device, &data);
}

1 个答案:

答案 0 :(得分:0)

如果您使用signal而非sigaction来设置处理程序,请记住,signal在获取信号后删除处理程序。并且你应该屏蔽信号,因此当在信号处理程序内部运行时它不会中断你的进程。我也不确定处理程序内部的系统调用ioctl(请参阅Async-signal-safe函数部分下的man7 signal)。

调用printk可能会减慢这些调用周围的其他操作(因为它们在I / O或缓冲时被阻止)的执行速度,因此它们可以使同步更慢(因此可能不会出现同步中的任何错误)。