2024-05-29 03:53:36 发布
网友
我知道在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
如果您的系统在/proc/[pid]/status中有Umask字段,您可以从中读取:
/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虚拟文件系统。下面是一个只有低级操作系统调用(所有异步安全)且没有错误检查的示例:
/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。在
umask_cmd
如果您的系统在
/proc/[pid]/status
中有Umask
字段,您可以从中读取:在CentOS 7.5、Debian 9.6下测试。在
或者,您可以添加线程锁:)
umask由子进程继承。您可以创建一个管道,分叉一个子进程,在那里获取umask并将结果写入管道,以便父进程可以读取它。在
相当昂贵,但没有任何特殊要求,如
/proc
虚拟文件系统。下面是一个只有低级操作系统调用(所有异步安全)且没有错误检查的示例:我所知道的唯一真正、明确的线程安全方法是调用新进程。在
请注意,如果您有bash或其他shell,也可以将其称为。因为它可能在一个奇怪的系统上,所以我选择在
umask_cmd
中使用python子进程,因为必须有python。如果您使用的是非怪异的*nix系统,那么可以使用sh或bash。在相关问题 更多 >
编程相关推荐