Respostas:
A partir do kernel 4.7 do Linux ( confirmação ), o umask está disponível no /proc/<pid>/status
.
$ grep '^Umask:' "/proc/$$/status"
Umask: 0022
Nota: esta resposta se aplica aos kernels Linux 4.6 e versões anteriores. Veja a resposta do @ egmont para versões mais recentes do kernel.
O umask não é exposto no procfs. Houve uma tentativa de adicioná-lo sem muito sucesso.
Existe uma maneira de obter o umask usando gdb
, como foi explicado aqui antes :
$ gdb --pid=4321
(gdb) call/o umask(0)
$1 = 077
(gdb) call umask($1)
$3 = 0
Lembre-se de que o gdb interrompe o processo e seus threads; portanto, a alteração temporária do umask é desprezível.
Se isso for bom para o seu caso, você pode usar este oneliner:
$ gdb --batch -ex 'call/o umask(0)' -ex 'call umask($1)' --pid=4321 2> /dev/null | awk '$1 == "$1" {print $3}'
077
Outra alternativa é, se você pode controlar o processo em execução, gravar o umask em um arquivo, uma saída ou algo semelhante e obtê-lo a partir daí.
No Linux, com systemtap
(as root
), você poderia fazer
stap -e 'probe kernel.function("do_task_stat") {
printf("%o\n", $task->fs->umask);
exit()
}
probe begin {system("cat /proc/4321/stat>/dev/null")}'
Fazer um cat /proc/4321/stat
dispararia essa sonda sobre do_task_stat
onde podemos acessar o fs->umask
campo do processo correspondente ' task_struct
no kernel.