调用 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() 电话并不关心你如何创造价值;你可以传入46。您需要阅读文档以了解会发生什么。不使用LOCK_NB 表示调用blocks,在锁建立之前不会返回。如果您确实设置了该标志,那么如果无法建立锁定,调用将引发 OSError 异常。

以上是关于调用 fcntl.lockf() 中的管道(“按位或”)的主要内容,如果未能解决你的问题,请参考以下文章

使用fcntl在Python中锁定文件

进程死亡时消失的 Python 锁

Apache Pig 中的按位运算?

管道到头部导致从 python 调用的 shell 脚本中的管道损坏

从底层的角度来看,Windows 中的命名管道和远程过程调用 (RPC) 有啥区别?

ngFor 块内模板中的异步管道触发 http GET 调用循环