ssize_t read(int fd, void *buf, size_t count, loff_t *offt)
fd:要打开的设备文件(文件描述符);
buf:返回给用户空间的数据缓冲区;
count:要读取的数据长度;
offt:相对于文件首地址的偏移,它用于跟踪文件操作中当前的位置,由于是由内核进行维护的,因此用户空间的read函数没有这个形参;
返回值:读取成功的话返回读取到的字节数;如果返回0表示读取到了文件末尾;如果返回负值,表示读取失败。
ssize_t write(int fd, const void *buf, size_t count, loff_t *offt)
fd:设备文件,表示打开的文件描述符;
buf:要写给设备写入的数据;
count:要写入的数据长度,也就是字节数;
offt:相对于文件首地址的偏移,它用于跟踪文件操作中当前的位置,由于是由内核进行维护的,因此用户空间的write函数没有这个形参;
返回值:写入成功的话返回写入的字节数;如果返回0表示没有写入任何数据;如果返回负值,表示写入失败。
static long unlocked_ioctl (struct file *filp, unsigned int cmd, unsigned long arg)
filp:要打开的设备文件(文件描述符);
cmd:应用发送过来的命令
arg:参数(实际上是参数的地址,需要在程序中进行强制类型转换);
返回值:0成功,其他失败;
对比
功能方面:read函数只能完成读的功能,write只能完成写的功能。读取大数据的时候效率高。ioctl既可以读也可以写。ioctl的接口是万能的,ioctl(fd, cmd, arg)第三个参数可以是一个整形变量,也可以是一个指向某种数据结构的指针。
性能方面:对于需要高性能的数据传输,read和write可能更合适,因为它们通常可以直接映射到设备的DMA操作。ioctl可能涉及到更多的上下文切换和处理,可能不适合高频率的数据传输。ioctl的语义一般是非阻塞的,read和write却省是阻塞的。