进程的当前 umask

进程的当前 umask

是否可以获得进程当前的 umask?/proc/<pid>/...例如从?

答案1

从 Linux 内核 4.7 开始(犯罪),umask 可用于/proc/<pid>/status.

$ grep '^Umask:' "/proc/$$/status"
Umask:  0022

答案2

注意:此答案适用于 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 写入文件、输出或类似的内容并从那里获取它。

答案3

在 Linux 上,使用systemtap(as 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")}'

执行 acat /proc/4321/stat操作将触发该探测,探查我们可以在内核中do_task_stat访问fs->umask相应进程的字段的位置。task_struct

相关内容