我正在尝试使用this tutorial中指定的os.fchmod()。但是,当我传入文件描述符和模式时,我得到了一个模糊的“无效参数”错误。
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暗示它可能)。
感谢。
答案 0 :(得分:1)
在MacOS上的fchmod
手册页中,EINVAL
的原因之一列为:
[EINVAL] fildes refers to a socket, not to a file.
显然 linux (但不是MacOS)支持"预先设置"模式,以便当您最终bind
时,它将获得您使用fchmod
预设的模式。这并不能保证在操作系统上工作,显然不适用于MacOS(我猜它也不适用于其他类Unix操作系统)。
我认为您需要使用该git问题中提到的umask
策略。然后,您可以在绑定后使用套接字的路径名调用os.chmod
,以确保模式设置完全符合您的要求(umask
仅允许您指定要从模式中清除的位)。
正如问题中所提到的,umask
的问题是只有一个掩码值,它由所有线程共享。如果您只有一个线程,或者所有线程都可以为创建的所有文件使用相同的掩码值,那么这不是问题。否则,您需要围绕umask
用法实施某种协同锁定,或者使用问题中提到的fork
hack在另一个问题中执行umask
/ bind
过程