我如何检查当前正在运行的程序的umask?
[更新:另一个进程,而不是当前进程。]
您可以将gdb附加到正在运行的进程,然后在调试器中调用umask:
(gdb) call umask(0) [Switching to Thread -1217489200 (LWP 11037)] $1 = 18 (gdb) call umask(18) $2 = 0 (gdb)
(注:18 = O22)
这表明可能有一个非常丑陋的方式来获得使用ptrace的umask。
从GNU C库手册:
下面是一个例子,展示如何用
umask
读取掩码而不用永久修改它:mode_t read_umask (void) { mode_t mask = umask (0); umask (mask); return mask; }
但是,如果你只是想读取掩码值,最好使用
getumask
,因为它是可重入的(至少在你使用GNU操作系统的时候)。
getumask
是glibc特有的。 所以,如果你重视可移植性,那么非重入式解决方案是唯一的解决方案。
编辑:我刚刚grepped ->umask
全部通过Linux源代码。 没有任何地方会让你获得一个不同的过程。 另外,没有getumask
; 显然这是一个赫德唯一的事情。
从Linux内核4.7开始,umask在/proc/<pid>/status
可用。
如果您是当前进程,则可以将文件写入/ 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+)$/)'