C Linux字符设备驱动程序:如何处理信号?
我正在尝试创建一个小的char设备驱动程序,它创建一个文件C Linux字符设备驱动程序:如何处理信号?,c,linux,kernel,linux-device-driver,C,Linux,Kernel,Linux Device Driver,我正在尝试创建一个小的char设备驱动程序,它创建一个文件/dev/foobar。在文件操作回调中,我有 ssize_t read(file* filp, char* buf, size_t count, loff_t* f_pos) { printk(KERN_INFO "device_read(%p,%s,%d)", filp, buf, count); return 0; } ssize_t write(file* filp, char* buf, size_t cou
/dev/foobar
。在文件操作回调中,我有
ssize_t read(file* filp, char* buf, size_t count, loff_t* f_pos)
{
printk(KERN_INFO "device_read(%p,%s,%d)", filp, buf, count);
return 0;
}
ssize_t write(file* filp, char* buf, size_t count, loff_t* f_pos)
{
printk(KERN_INFO "device_write(%p,%s,%d)", filp, buf, count);
return 0;
}
但是,当我尝试使用cat/dev/foobar
读取文件时,它会完全填满消息缓冲区,系统会停止运行,我必须删除/var/log/
或其部分内容,因为我的虚拟驱动器已满
我不能用
Ctrl-C
或其他方法中止读取。如何使进程可中止?从read
函数返回0意味着EOF,因此cat
命令不应重复调用该函数。但是从write
返回0只需告诉VFS重新运行此函数。您确定问题是由读取文件而不是写入文件引起的(例如,使用输出重定向/dev/foobar
)?@Tsyvarev是的,您是对的。我不确定是否与问题有关,但使用%s打印缓冲区通常是个坏主意。它不包括以null结尾的字符串,这在缓冲区中通常是不正确的。@MarcinKajzler;我复制粘贴了这个,我基本上对内核编程一无所知。