为什么 os.fchmod 不起作用?
Why is os.fchmod not working?
我正在尝试使用 this tutorial 中指定的 os.fchmod()。但是,当我传入文件描述符和模式时,我得到了一个模糊的 "Invalid Argument" 错误。
import socket
import stat
import os
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
os.fchmod(s.fileno(), stat.S_IRWXO)
我该如何解决这个问题?目标是创建一个具有更改权限的 Unix 域套接字(this git issue 暗示它是可能的)。
谢谢。
在 MacOS 的 fchmod
手册页中,EINVAL
的原因之一被列为:
[EINVAL] fildes refers to a socket, not to a file.
显然 linux(但 MacOS 不支持)支持 "pre-setting" 模式,因此当您最终 bind
时,它将获得该模式您预先设置了 fchmod
。这不能保证跨操作系统工作,显然不能在 MacOS 上工作(我猜它也不能在其他类 Unix 操作系统上工作)。
我认为您需要使用 git 问题中提到的 umask
策略。然后,您可以在 绑定后使用套接字的路径名 调用 os.chmod
以确保模式设置完全符合您的需要(umask
仅允许您指定要从模式中 清除 的位)。
如问题中所述,umask
的问题在于只有一个掩码值,由所有线程共享。如果您只有一个线程,或者所有线程都可以对创建的所有文件使用相同的掩码值,那不是问题。否则,您要么需要围绕 umask
用法实施某种协作锁定,要么使用问题中提到的 fork
hack 在另一个问题中执行 umask
/bind
过程。
我正在尝试使用 this tutorial 中指定的 os.fchmod()。但是,当我传入文件描述符和模式时,我得到了一个模糊的 "Invalid Argument" 错误。
import socket
import stat
import os
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
os.fchmod(s.fileno(), stat.S_IRWXO)
我该如何解决这个问题?目标是创建一个具有更改权限的 Unix 域套接字(this git issue 暗示它是可能的)。
谢谢。
在 MacOS 的 fchmod
手册页中,EINVAL
的原因之一被列为:
[EINVAL] fildes refers to a socket, not to a file.
显然 linux(但 MacOS 不支持)支持 "pre-setting" 模式,因此当您最终 bind
时,它将获得该模式您预先设置了 fchmod
。这不能保证跨操作系统工作,显然不能在 MacOS 上工作(我猜它也不能在其他类 Unix 操作系统上工作)。
我认为您需要使用 git 问题中提到的 umask
策略。然后,您可以在 绑定后使用套接字的路径名 调用 os.chmod
以确保模式设置完全符合您的需要(umask
仅允许您指定要从模式中 清除 的位)。
如问题中所述,umask
的问题在于只有一个掩码值,由所有线程共享。如果您只有一个线程,或者所有线程都可以对创建的所有文件使用相同的掩码值,那不是问题。否则,您要么需要围绕 umask
用法实施某种协作锁定,要么使用问题中提到的 fork
hack 在另一个问题中执行 umask
/bind
过程。