2008-10-03 31 views
24

如何检查当前正在运行的程序的umask?linux:获取已经运行的进程的umask?

[更新:另一个进程,而不是当前进程]

+0

当前进程?还是一个外国程序? – 2008-10-03 00:26:34

+0

前段时间有一个[补丁](https://lkml.org/lkml/2012/5/4/451)报告了进程'/ proc/pid/status中的umask'和`/ proc/pid/stat`。但它似乎没有进入主线内核。 – 2015-11-18 04:13:19

+0

[unix.se]上的同一问题:[当前pid进程的umask](http://unix.stackexchange.com/q/258284) – 2016-01-29 23:06:52

回答

25

您可以将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。

1

如果你当前的进程,你可以写一个文件到/ tmp,并检查其设置。一个更好的解决方案是调用umask(3)传递零 - 该函数返回调用之前的设置 - 然后通过将该值传递回umask将其重置。

另一个进程的umask似乎没有公开。

9

从GNU C库手册:

这里是示出如何使用umask 读掩模不会永久改变其一个例子:

mode_t 
read_umask (void) 
{ 
    mode_t mask = umask (0); 
    umask (mask); 
    return mask; 
} 

然而,最好是使用getumask如果您只想读取 掩码值,因为它是可重入的(至少如果您使用的是GNU操作系统的 )。

getumask是glibc特定的,但。所以如果你重视可移植性,那么非重入式解决方案是唯一的解决方案。

编辑:我刚刚通过Linux源代码grep为->umask。没有任何地方会让你获得另一个过程的秘密。此外,没有getumask;显然这是一个赫德唯一的事情。

0

一位同事刚刚向我展示了一个命令行模式。我总是运行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+)$/)' 
2

与Linux内核4.7开始,umask是在/proc/<pid>/status可用。

相关问题