设备驱动read/write函数中loff_t *f_pos指针是否为同一指针的疑问
关于scull驱动中read/write函数loff_t *f_pos的疑问解答
没错,这两个函数里的loff_t *f_pos确实指向的是同一个偏移量变量!
具体来说,当进程打开你的scull设备文件时,内核会为这个打开实例创建一个struct file结构体,这个结构体里就维护着当前的文件读写偏移量。不管是调用read还是write系统调用,内核都会把这个偏移量的指针传递给对应的驱动函数(也就是你定义的scull_read和scull_write)。
所以你在示例里看到两个函数都会递增这个指针指向的值是完全合理的——它们共享同一个偏移量状态。比如你先调用read读取了N个字节,*f_pos被更新后,接下来调用write时,写入操作就会从这个更新后的偏移位置开始,反过来也是一样的。
这里需要额外提一句:如果是不同进程(或者同一进程的不同线程)打开同一个设备文件的不同实例,每个实例都会有自己独立的struct file,这时候它们的f_pos自然就不是同一个指针了。但同一个打开实例的read和write操作,必然共享这个偏移量指针。
内容的提问来源于stack exchange,提问作者user1703186
相关产品推荐
相关产品推荐

