在Linux中独占性地打开设备文件

20

有哪些方法可以专门打开设备文件(比如,显示帧缓冲区)?

[信息:我已经知道flock()等函数,只有当其他应用程序也在使用时才有效果(换句话说:如果已经锁定,则open()将成功但flock()将失败)--> 但是从open()检索到的设备句柄仍然可以用于写入显示器..]

如果我想要强制对设备文件进行这种独占访问怎么办?这样的执行是否可能?


1
谷歌搜索“mandatory locking linux”,这个有很多问题... - Basile Starynkevitch
1
这是有关 Linux 中强制性锁定和建议性锁定的链接... http://www.thegeekstuff.com/2012/04/linux-file-locking-types/ - Kinjal Patel
@jww 有没有使用 cgroups 的选项,也许通过 systemd?cgroups 中有一个 device 控制器,您应该能够使用它来默认阻止对设备的访问,并允许您的特定进程访问。device 控制器可以阻止在指定设备上执行 mknodreadwrite 操作。 - Iwillnotexist Idonotexist
如果这是一个设备文件,您可以尝试将问题视为并发问题,并希望饿死其他进程以访问该设备。为此,您可能需要编写一个带有与文件关联的互斥量的设备驱动程序。DD 可以有两个名为 excl_open 和 excl_close 的函数。第一个函数可以锁定对文件的访问,并将描述符返回给您,就像进行了正常的 open() 调用一样。excl_close... 您可以想象一下。 - Tretorn
1
为您的应用程序创建一个登录用户,并设置设备文件权限,只允许该用户读/写。 - Fusho
显示剩余3条评论
4个回答

8
fcntl(2)中:
要使用强制锁定,必须在包含要锁定的文件的文件系统上启用强制锁定,并在文件本身上启用强制锁定。
此外,您还需要在内核中启用CONFIG_MANDATORY_FILE_LOCKING
使用"-o mand"选项对mount(8)进行文件系统上启用强制锁定,或者使用mount(2)的MS_MANDLOCK标志。通过禁用文件的组执行权限并启用设置组ID权限位(参见chmod(1)和chmod(2)),可以在文件上启用强制锁定。
POSIX没有指定强制锁定。其他一些系统也支持强制锁定,尽管在各个系统上启用强制锁定的详细信息有所不同。
因此,由于您要求一个符合POSIX标准的解决方案,答案是:否,POSIX标准中没有这样的功能。
编辑:请参阅下面的评论。

1
从man页面中:“警告:Linux的强制锁定实现不可靠。请参见下面的BUGS。由于这些错误以及该功能被认为很少使用,自Linux 4.5起,强制锁定已成为一个可选功能,受配置选项(CONFIG_MANDATORY_FILE_LOCKING)的控制。在Linux 5.15及以上版本中,不再支持此功能。” - MAChitgarha

0

尝试lockf():在打开的文件上应用、测试或删除POSIX锁


-1
如果您想要獲得設備的獨佔訪問權,請在 /var/lock 中創建一個鎖文件。可以使用 open("my_device.lock", O_CREAT|O_EXCL, 0777) 創建此鎖文件的進程將獲得對該設備的訪問權,而其他進程必須等待。當進程使用完設備後,它會關閉文件。
這樣的鎖定只是一種諮詢方式,並不能保證沒有其他進程(您可能不知道的)訪問該設備。

1
当多个不相关的程序尝试打开设备时会发生什么? - jww
@jww 其他进程当然仍然可以打开设备并做一些不好的事情。诀窍在于,它们应该首先尝试使用 O_EXCL 打开锁定文件,然后再执行操作。最好的方法是编写一个库,提供例如 write() 函数,该函数处理打开和关闭锁定文件。然后每个进程都将使用此库与设备进行交互。 - Frode Akselsen

-2
打开设备时,您应该在Linux中使用打开系统调用并检查可用设备列表,例如/dev/ttyUSB0或/dev/ttyS0等。打开设备后,您将获得一个描述符,以便在设备上进行读写通信。 要了解更多详细信息,请访问以下链接: http://www.firmcodes.com/lower-level-file-handling-in-linux/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接