Linux设备驱动程序原子GET然后通过ioctl SET

时间:2014-02-26 12:46:22

标签: linux driver atomic ioctl

我想通过ioctl从设备驱动程序中读取结构,在用户空间中更改结构中的值,然后将其写回。如果没有其他一些过程改变读写之间的结构,这可能是原子地做的吗?

我可以在通话之前锁定文件描述符(flock())并在之后解锁吗?或者,我可以实现锁定并解锁ioctl命令,在驱动程序中设置内部锁定变量吗?如果进程终止会发生什么,变量怎么能被清除?

我可以使用sysfs而不是ioctl来达到同样的效果吗?

1 个答案:

答案 0 :(得分:0)

不容易,而且很可能是错误的做法。

相反,我会选择“有条件的移动”方法。用户空间程序检索当前值,修改它,然后将旧值附加到写入IOCTL以用作条件:

成功:

read                        -> 5
write 10 if currently 5     -> okay

失败:

read                        -> 5
... someone else changes it ...
write 10 if currently 5     -> nope

这样,如果用户空间程序不遵循协议,内核就不必保留需要清理的任何类型的状态。