- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
Windows 可以选择以独占访问权限打开文件。 Unix 没有。
为了确保对某些文件或设备的独占访问,在 Unix 中通常使用通常存储在/var/lock 目录中的锁定文件。
C 指令 open( "/var/lock/myLock.lock", O_RDWR | O_CREAT | O_EXCL, 0666 )
如果锁文件已经存在则返回 -1,否则创建它。该函数是原子的,并确保没有竞争条件。
释放资源时,通过如下指令删除锁文件remove("/var/lock/myLock.lock")
.
这种方法有两个问题。
程序可能会在不解除锁定的情况下终止。例如,因为它被杀死、崩溃或其他原因。锁定文件保留在原位,即使不再使用该资源,也会阻止对资源的任何访问。
锁定文件是使用组和世界写入权限创建的,但通常的做法是配置帐户以使用权限掩码来清除组和世界写入权限。因此,如果我们有一个可靠的方法来确定锁是孤立的(未使用),则不允许非文件所有者的用户删除它。
作为记录,我使用锁定文件来确保对连接到串行端口的设备(实际上是/dev/ttyUSBx)的独占访问。咨询方式,需要配合,是可以的。但应确保不同用户之间的独占访问。
有没有比锁文件更好的同步方式?如何判断创建锁文件的进程是否还在运行?如果不使用,如何使其他用户可以删除锁定文件?
我想出的一个解决方案是将该文件用作 Unix 套接字文件。如果该文件存在,请尝试使用该文件进行连接。如果失败,我们可以假设文件的所有者进程已经死了。这需要在所有者进程中的套接字 accept()
上有一个线程循环。不幸的是,系统将不再是原子的。
最佳答案
看看富有启发性的演示File Locking Tricks and Traps :
This short talk presents several common pitfalls of file locking and a few useful tricks for using file locking more effectively.
编辑:更准确地解决您的问题:
Is there a better synchronization method than the lock file?
正如@Hasturkun 已经提到的和上面的演示文稿所说,您需要使用的系统调用是flock(2)
.如果您希望在多个用户之间共享的资源已经是基于文件的(在您的情况下是 /dev/ttyUSBx
),那么您可以 flock
设备文件本身。
How to determine if the process who created the lock file is still running?
您不必确定这一点,因为 flock
-ed 锁将在关闭与您的文件关联的文件描述符时自动释放,即使进程已终止。
How making it possible for another user to remove the lock file if not in use?
如果您要锁定设备文件本身,则无需删除该文件。即使您决定在 /var/lock
中锁定一个普通文件,使用 flock
您也无需删除该文件即可释放锁定。
关于c++ - 最优锁文件方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1599459/
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!