调用 fcntl.lockf() 中的管道(“按位或”)
Posted
技术标签:
【中文标题】调用 fcntl.lockf() 中的管道(“按位或”)【英文标题】:pipe ("bitwise OR") in call to fcntl.lockf() 【发布时间】:2019-06-17 06:37:16 【问题描述】:This answer 包含以下行:
fcntl.lockf(fp, fcntl.LOCK_EX | fcntl.LOCK_NB)
管道,在 Python 中是 "bitwise OR"
我已经检查了fcntl.lockf(fd, cmd, len=0, start=0, whence=0) 的 Python 文档,它说 cmd 是其中之一:
LOCK_UN - 解锁
LOCK_SH – 获取共享锁
LOCK_EX – 获取排他锁
也一直在阅读这些变量here
有谁了解那条线及其作用,以及它是否可以仅使用一个参数而没有管道符号?
在 Python 文档中甚至没有提到 LOCK_NB..
【问题讨论】:
与 ***.com/questions/44115670/combine-bitflags 相关,以及关于 SO 处理组合位标志的任何其他问题 【参考方案1】:这些名称是数字常量,每个都是 2 的幂。这意味着它们是具有单个位集的整数。
您可以将这些数字与|
组合以生成具有多个位集的整数,每个位代表一个特定选项:
>>> import fcntl
>>> fcntl.LOCK_SH # bit 1 set
1
>>> fcntl.LOCK_EX # bit 2 set
2
>>> fcntl.LOCK_NB # bit 3 set
4
>>> fcntl.LOCK_UN # bit 4 set
8
>>> fcntl.LOCK_SH | fcntl.LOCK_UN # combine bits 1 and 4
9
>>> format(fcntl.LOCK_SH | fcntl.LOCK_UN, '04b')
'1001'
这是在系统调用中传递设置配置的一种非常常见的方式。 fctnl.lock()
就是一个这样的例子,但同样的技术还有更多的例子。 os.open()
call 是另一个示例,re
module flags 也是如此。
重要的是要意识到这些只是整数。您可以传入6
,而不是使用fcntl.LOCK_EX | fcntl.LOCK_NB
(设置位2 和3)设置标志:
fcntl.lockf(fp, 6)
就lockf()
函数而言,没有区别。使用命名常量的意义在于,使用它们可以生成自文档化代码。
【讨论】:
谢谢不知道。签入解释器,fcntl.LOCK_EX
是 2,fcntl.LOCK_NB
是 4,fcntl.LOCK_SH
是 1,(fcntl.LOCK_EX | fcntl.LOCK_NB)
是 6。你能描述一下改变该行中的内容会产生什么影响吗?例如,如果您只有 fcntl.LOCK_EX
并省略了管道和第二部分怎么办?
@cardamom:首先,fcntl.lock()
电话并不关心你如何创造价值;你可以传入4
或6
。您需要阅读文档以了解会发生什么。不使用LOCK_NB
表示调用blocks,在锁建立之前不会返回。如果您确实设置了该标志,那么如果无法建立锁定,调用将引发 OSError
异常。以上是关于调用 fcntl.lockf() 中的管道(“按位或”)的主要内容,如果未能解决你的问题,请参考以下文章
管道到头部导致从 python 调用的 shell 脚本中的管道损坏