在 Linux 中独占打开一个设备文件

Posted

技术标签:

【中文标题】在 Linux 中独占打开一个设备文件【英文标题】:Exclusively open a device file in Linux 【发布时间】:2013-03-23 16:00:43 【问题描述】:

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

[信息:我已经知道flock() 和朋友,它们只有在其他应用程序也在使用它时才会起作用(换句话说:open() 会成功,但如果flock() 已经锁定,则会失败)- -> 但仍然可以使用从 open() 检索到的设备句柄来写入显示器..]

如果我想对设备文件强制执行此类独占访问,该怎么办?这样的执法怎么可能?

提前致谢!

【问题讨论】:

Google for mandatory locking linux 有很多问题... 这里是 linux 中强制和咨询锁定的链接......thegeekstuff.com/2012/04/linux-file-locking-types @KinjalPatel 只有在您使用flock() 时才有效,否则不会阻止写入。自动限制设备独占打开的唯一方法是让设备驱动程序自行执行open 引用计数。 打开调制解调器的(的)第一个进程是否在此期间成为设备的所有者?如果是这样,您的第一个打开过程是否可以将调制解调器设备上的权限设置为 000,这样就没有人可以从那里打开它?当然,在打开设备和更改其模式之间存在竞争条件,但如果系统在进程完成时自动将所有权恢复回系统,它可能或多或少会产生正确的效果。具有足够权限的用户或同一用户的另一个进程也可以在打开权限之前使用权限。 如何为您的应用程序创建一个登录用户并将设备文件权限设置为只允许该用户读取/写入? 【参考方案1】:

来自fcntl(2):

要使用强制锁定,必须启用强制锁定 在包含要锁定的文件的文件系统上,以及 文件本身。

...另外,您需要在内核中启用CONFIG_MANDATORY_FILE_LOCKING

在文件系统上使用强制锁定启用 mount(8) 的“-o mand”选项,或 MS_MANDLOCK 标志 安装(2)。通过禁用组对文件启用强制锁定 对文件执行权限并启用 set-group-ID 权限 sion 位(参见 chmod(1) 和 chmod(2))。

POSIX 未指定强制锁定。其他一些系统也 支持强制锁定,虽然详细介绍了如何启用它 因系统而异。

因此,当您请求符合posix 的解决方案时,答案是:,POSIX 标准中没有这样的功能。

【讨论】:

【参考方案2】:

要打开一个设备,你应该在 linux 中使用 open system call 并检查可用设备列表,例如 /dev/ttyUSB0 或 /dev/ttyS0 等,然后打开它,你会得到一个要在设备上写入和读取的描述符是您打开设备进行通信。 要了解更多详细信息,请点击链接: http://www.firmcodes.com/lower-level-file-handling-in-linux/

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

如果您想获得对设备的独占访问权限,请在/var/lock 中创建一个锁定文件。可以使用open("my_device.lock", O_CREAT|O_EXCL, 0777) 创建锁定文件的进程可以访问设备,其他进程必须等待。使用设备完成该过程后,它会关闭文件。

这种锁定只是建议性的,并不能保证没有其他进程(您不知道)访问该设备。

【讨论】:

当多个不相关的程序试图打开设备时会发生什么? @jww 其他进程当然仍然可以打开设备并做一些讨厌的事情。诀窍是他们应该在做某事之前先尝试用 O_EXCL 打开锁定文件。最好是你编写一个库,提供例如处理打开和关闭锁定文件的 write() 函数。然后每个进程将使用这个库与设备进行交互。

以上是关于在 Linux 中独占打开一个设备文件的主要内容,如果未能解决你的问题,请参考以下文章

Linux设备驱动程序,内核线程无法打开文件?

Linux 内核Linux 内核体系架构 ( 进程调度 | 内存管理 | 中断管理 | 设备管理 | 文件系统 )

AQS共享锁和独占锁

Linux 0.11-打开终端设备文件-33

Linux 0.11-打开终端设备文件-33

嵌入式linux设备驱动,无法打开设备文件