Ответы:
Начиная с ядра Linux 4.7 ( commit ), umask доступен в /proc/<pid>/status
.
$ grep '^Umask:' "/proc/$$/status"
Umask: 0022
Примечание: этот ответ относится к ядрам Linux 4.6 и более ранним версиям. Смотрите ответ @ egmont для более новых версий ядра.
Umask не выставляется в procfs. Была попытка добавить его без особого успеха.
Существует способ получить Umask gdb
, как было объяснено здесь ранее :
$ gdb --pid=4321
(gdb) call/o umask(0)
$1 = 077
(gdb) call umask($1)
$3 = 0
Помните, что GDB останавливает процесс и его потоки, поэтому временное изменение umask незначительно.
Если это хорошо для вашего случая, вы можете использовать этот oneliner:
$ gdb --batch -ex 'call/o umask(0)' -ex 'call umask($1)' --pid=4321 2> /dev/null | awk '$1 == "$1" {print $3}'
077
Другой вариант, если вы можете управлять запущенным процессом, записать umask в файл, вывод или что-то подобное и получить его оттуда.
В Linux, с systemtap
(как root
), вы можете сделать
stap -e 'probe kernel.function("do_task_stat") {
printf("%o\n", $task->fs->umask);
exit()
}
probe begin {system("cat /proc/4321/stat>/dev/null")}'
Выполнение a cat /proc/4321/stat
вызовет эту проверку того, do_task_stat
где мы можем получить доступ к fs->umask
полю соответствующего процесса ' task_struct
в ядре.