ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
用于从设备检索数据。此位置的空指针会导致读取系统调用失败并显示-EINVAL(“无效参数”)。非负返回值表示成功读取的字节数(返回值是“有符号大小”类型,通常是目标平台的本机整数类型)。
ssize_t (*aio_read)(struct kiocb *, char __user *, size_t,loff_t);
启动异步读取——在函数返回之前可能无法完成的读取操作。如果此方法为NULL,则所有操作都将由read 处理(同步)。
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
向设备发送数据。如果为 NULL,则将 -EINVAL 返回给调用 write 系统调用的程序。如果返回值非负,则表示成功写入的字节数。
ssize_t (*aio_write)(struct kiocb *, const char __user *, size_t, loff_t *);
在设备上启动异步写入操作。
从 LDD3 得到这个声明,谁能解释如果设备驱动程序没有实现异步写入功能会发生什么?会,它会像 asyn read 一样升级为静默同步(如果它为 NULL)。
aio_read
和中的aio_write
条目file_operations
已过时read_iter
,由and替换(尽管不相同)write_iter
。可写file_operations
需要至少有一个write
和/或write_iter
,VFS 将使用任何一个可用的。(可用性已提前检查,并使用 记录FMODE_CAN_WRITE
。)aio_write
本身确实需要write_iter
,如果它不可用将返回-EINVAL
。有一个通用的实现可以在许多情况下使用,但它不会自动用作后备。