代码之家  ›  专栏  ›  技术社区  ›  cardamom

调用fcntl.lockf()时的管道(“按位或”)。

  •  1
  • cardamom  · 技术社区  · 5 年前

    This answer 包含以下行:

    fcntl.lockf(fp, fcntl.LOCK_EX | fcntl.LOCK_NB)
    

    管道,在python a中 "bitwise OR"

    我已经检查了python文档 fcntl.lockf(fd, cmd, len=0, start=0, whence=0) 它说,命令是:

    锁定“解锁”

    锁“获取共享锁”

    Lock_

    也一直在读那些变量 here

    是否有人理解这条线以及它的作用,以及它是否只使用一个参数而不使用管道符号?

    在python文档中甚至没有提到lock_nb。

    1 回复  |  直到 5 年前
        1
  •  2
  •   Martijn Pieters    5 年前

    那些名字是 数字常量 ,每个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 .

    重要的是要认识到 整数 . 而不是用 fcntl.LOCK_EX | fcntl.LOCK_NB (设置第2位和第3位),您可以直接输入 6 :

    fcntl.lockf(fp, 6)
    

    而且,就 lockf() 功能相关。使用命名常量的意义在于,使用这些常量 自我文件码 .