为什么os.fchmod无法正常工作?

时间:2018-04-20 03:56:52

标签: python sockets permissions unix-socket

我正在尝试使用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暗示它可能)。

感谢。

1 个答案:

答案 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过程