【发布时间】:2014-02-26 12:46:22
【问题描述】:
我想通过 ioctl 从设备驱动程序读取结构,更改用户空间结构中的值,然后将其写回。这是否可以在不改变读写之间结构的其他进程的情况下以原子方式进行?
我可以在调用之前锁定文件描述符 (flock()) 并在之后解锁吗?或者,我可以实现在驱动程序中设置内部锁定变量的锁定和解锁 ioctl 命令吗?如果进程死了会发生什么,变量如何被清除?
我可以使用 sysfs 而不是 ioctl 来达到同样的效果吗?
【问题讨论】:
我想通过 ioctl 从设备驱动程序读取结构,更改用户空间结构中的值,然后将其写回。这是否可以在不改变读写之间结构的其他进程的情况下以原子方式进行?
我可以在调用之前锁定文件描述符 (flock()) 并在之后解锁吗?或者,我可以实现在驱动程序中设置内部锁定变量的锁定和解锁 ioctl 命令吗?如果进程死了会发生什么,变量如何被清除?
我可以使用 sysfs 而不是 ioctl 来达到同样的效果吗?
【问题讨论】:
不容易,而且很可能是错误的方法。
相反,我会采用“有条件移动”的方法。用户空间程序检索当前值,对其进行修改,然后将旧值附加到写入 IOCTL 以用作条件:
成功:
read -> 5
write 10 if currently 5 -> okay
失败:
read -> 5
... someone else changes it ...
write 10 if currently 5 -> nope
这样,如果用户空间程序不遵循协议,内核就不必保留任何需要清理的状态。
【讨论】: