我想通过ioctl从设备驱动程序中读取结构,在用户空间中更改结构中的值,然后将其写回。如果没有其他一些过程改变读写之间的结构,这可能是原子地做的吗?
我可以在通话之前锁定文件描述符(flock())并在之后解锁吗?或者,我可以实现锁定并解锁ioctl命令,在驱动程序中设置内部锁定变量吗?如果进程终止会发生什么,变量怎么能被清除?
我可以使用sysfs而不是ioctl来达到同样的效果吗?
答案 0 :(得分:0)
不容易,而且很可能是错误的做法。
相反,我会选择“有条件的移动”方法。用户空间程序检索当前值,修改它,然后将旧值附加到写入IOCTL以用作条件:
成功:
read -> 5
write 10 if currently 5 -> okay
失败:
read -> 5
... someone else changes it ...
write 10 if currently 5 -> nope
这样,如果用户空间程序不遵循协议,内核就不必保留需要清理的任何类型的状态。