linux:获取已经运行的进程的umask?

我如何检查当前正在运行的程序的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+)$/)'