如何检查当前正在运行的程序的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的源代码。 有无处,将让你一个不同的进程的umask。 此外,没有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+)$/)'