读取umask(线程安全)

2024-05-29 03:53:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道在Python中读取umask的模式:

current_umask = os.umask(0)  # line1
os.umask(current_umask)      # line2
return current_umask         # line3

但这不是线程安全的。在

在第1行和第2行之间执行的线程将具有不同的单元掩码。在

有没有线程安全的方法来读取Python中的umask?在

相关:https://bugs.python.org/issue35275


Tags: 方法httpsorgreturnos模式current线程
3条回答

如果您的系统在/proc/[pid]/status中有Umask字段,您可以从中读取:

import os

def getumask():
    pid = os.getpid()
    with open(f'/proc/{pid}/status') as f:
        for l in f:
            if l.startswith('Umask'):
                return int(l.split()[1], base=8)
        return None

在CentOS 7.5、Debian 9.6下测试。在

或者,您可以添加线程锁:)

umask由子进程继承。您可以创建一个管道,分叉一个子进程,在那里获取umask并将结果写入管道,以便父进程可以读取它。在

相当昂贵,但没有任何特殊要求,如/proc虚拟文件系统。下面是一个只有低级操作系统调用(所有异步安全)且没有错误检查的示例:

import os
import struct

def get_umask():
    pipe = os.pipe()
    pid = os.fork()
    if pid == 0:
        os.close(pipe[0])
        umask = os.umask(0)
        os.write(pipe[1], struct.pack('H', umask))
        os.close(pipe[1])
        os._exit(0)
    else:
        os.close(pipe[1])
        value = os.read(pipe[0], 2)
        os.close(pipe[0])
        os.waitpid(pid, 0)
        return struct.unpack('H', value)[0]

print("umask {:03o}".format(get_umask()))

我所知道的唯一真正、明确的线程安全方法是调用新进程。在

import subprocess
umask_cmd = ('python', '-c', 'import os; print(os.umask(0777))')
umask = int(subprocess.check_output(umask_cmd))

请注意,如果您有bash或其他shell,也可以将其称为。因为它可能在一个奇怪的系统上,所以我选择在umask_cmd中使用python子进程,因为必须有python。如果您使用的是非怪异的*nix系统,那么可以使用sh或bash。在

相关问题 更多 >

    热门问题