我一直在为真正奇怪的问题拉扯我的头发。内核模块无法在没有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);
}
答案 0 :(得分:0)
如果您使用signal
而非sigaction
来设置处理程序,请记住,signal
在获取信号后删除处理程序。并且你应该屏蔽信号,因此当在信号处理程序内部运行时它不会中断你的进程。我也不确定处理程序内部的系统调用ioctl
(请参阅Async-signal-safe函数部分下的man7 signal)。
调用printk
可能会减慢这些调用周围的其他操作(因为它们在I / O或缓冲时被阻止)的执行速度,因此它们可以使同步更慢(因此可能不会出现同步中的任何错误)。