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

时间:2008-10-03 00:24:44

标签: linux unix umask

如何检查当前正在运行的程序的umask?

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

5 个答案:

答案 0 :(得分: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 :(得分:9)

从GNU C Library手册:

  

以下示例说明如何使用umask读取掩码   没有永久改变它:

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

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

getumask是glibc特有的。因此,如果您重视可移植性,那么不可重入的解决方案就是唯一的解决方案。

编辑:我刚刚通过Linux源代码搜索了->umask。无处可以获得不同过程的umask。此外,没有getumask;显然这只是赫德的事情。

答案 2 :(得分:4)

从Linux内核4.7开始,/proc/<pid>/status中提供了umask。

答案 3 :(得分:1)

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

其他进程的umask似乎没有曝光。

答案 4 :(得分: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+)$/)'