我正在尝试在Linux内核中开发FIFO虚拟字符设备驱动程序。 我试图将数据从一个设备上执行的一个进程复制到另一个同类型设备上执行的另一个进程。
我试图从mydevice1
中读取 cat /dev/mydevice1
并写入mydevice
echo a > /dev/mydevice
但我一直收到错误:
cat:/ dev / mydevice1:参数无效
在第二个设备输出(即读取设备)中。
这是我从设备中读取的代码
static ssize_t device_read( struct file *file,char *bufStoreData, size_t count,
loff_t *ppos )
{
ssize_t val = 1;
if(access_mode == WRITE_MY)
return -EINVAL;
else
res = wait_event_interruptible (read_queue, ready_to_read);
printk(KERN_ALERT "going to copy\n");
res = copy_from_user(bufStoreData,virtual_device.data,count);
printk(KERN_ALERT "copied data %c \n",virtual_device.data[0]);
ready_to_read = 0;
ready_to_write = 1;
wake_up_interruptible (&write_queue);
return val;
}
当我使用dmesg
检查输出时,我得到正在复制的数据,但是我没有在设备上获得任何输出。在读取设备的输出中获取无效参数。
答案 0 :(得分:1)
同意n.m和Safayet Ahmed,请尝试更改:
res = copy_from_user(bufStoreData,virtual_device.data,count);
要:
res = copy_to_user(bufStoreData,virtual_device.data,count);
命名法可能有点令人困惑,我认为它是用户空间进程从内核内存读取数据或将数据写入内核内存。
在稍微不同的主题上,无论读取的字节数是多少,函数始终返回1
。传统的读取函数返回读取的字节数,或-1
与设置errno
一起表示错误。你有意打破这个惯例吗?
此外,每次函数运行时,wait_event_interruptible
变量中res
的结果都会被覆盖。