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()))