我该如何检查当前正在运行的程序的umask?
[更新:另一个进程,而不是当前进程。]
您可以将gdb附加到正在运行的进程上,然后在调试器中调用umask:
(gdb) attach <your pid>
...
(gdb) call umask(0)
[Switching to Thread -1217489200 (LWP 11037)]
$1 = 18 # this is the umask
(gdb) call umask(18) # reset umask
$2 = 0
(gdb)
(注意:在此示例中,18对应于umask的O22
)
这表明可能有一种非常丑陋的方法可以使用ptrace获取umask。
从Linux内核4.7开始,umask可以在/proc/<pid>/status
中找到。
《GNU C Library手册》中写道:
Here is an example showing how to read the mask with
umask
without changing it permanently:
mode_t read_umask (void) { mode_t mask = umask (0); umask (mask); return mask; }
However, it is better to use
getumask
if you just want to read the mask value, because it is reentrant (at least if you use the GNU operating system).
getumask
是特定于glibc的。因此,如果您重视可移植性,则非可重入解决方案是唯一的解决方案。
编辑:我刚刚在整个Linux源代码中搜索了->umask
。没有任何地方可以获取不同进程的umask。此外,没有getumask
;这似乎只在Hurd上有。
如果您是当前进程,可以将文件写入/tmp并检查其设置。更好的解决方案是调用umask(3),传递零 - 函数返回调用之前的设置 - 然后通过将该值传回umask来重新设置它。
另一个进程的umask似乎没有暴露出来。
我的同事向我展示了这个命令行模式。我通常都在使用emacs,所以下面的例子中会包含它。而perl
则是我的贡献:
sudo gdb --pid=$(pgrep emacs) --batch -ex 'call/o umask(0)' -ex 'call umask($1)' 2> /dev/null | perl -ne 'print("$1\n")if(/^\$1 = (\d+)$/)'
至少在内核4.18中,有一个选项可以搜索状态proc文件:
grep Umask /proc/<PID>/status
/proc/pid/status
和/proc/pid/stat
中报告进程的umask。但是似乎这个补丁并没有被合并到主线内核中。 - Craig McQueen