30

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

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

4

5 回答 5

27

您可以将 gdb 附加到正在运行的进程,然后在调试器中调用 umask:

(gdb) attach <your pid>
...
(gdb) call umask(0)
[Switching to Thread -1217489200 (LWP 11037)]
$1 = 18 # this is the umask
(gdb) call umask(18) # reset umask
$2 = 0
(gdb) 

(注意:18 对应O22于本例中的 umask)

这表明使用 ptrace 获取 umask 可能有一种非常丑陋的方法。

于 2008-10-03T04:46:39.717 回答
12

从 Linux 内核 4.7 开始,umask 在/proc/<pid>/status.

于 2017-03-28T10:14:52.180 回答
8

来自 GNU C 库手册:

这是一个示例,展示了如何在umask 不永久更改掩码的情况下读取掩码:

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

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

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

编辑:我刚刚->umask通过 Linux 源代码搜索了所有内容。没有任何地方可以为您提供不同进程的 umask。此外,没有getumask; 显然这是赫德唯一的事情。

于 2008-10-03T01:19:25.050 回答
2

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

另一个进程的 umask 似乎没有暴露。

于 2008-10-03T01:04:54.710 回答
1

一位同事刚刚向我展示了这个命令行模式。我总是在运行 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+)$/)'
于 2016-08-09T22:14:57.300 回答