【问题标题】:linux: getting umask of an already running process?linux:获取已运行进程的umask?
【发布时间】:2010-09-14 23:29:49
【问题描述】:

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

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

【问题讨论】:

标签: linux unix umask


【解决方案1】:

您可以将 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 可能有一种非常丑陋的方法。

【讨论】:

  • 谢谢!并感谢提醒您重新设置 umask!
  • 如果您像我一样感到困惑 - $1 = 18 行表示进程 umask 以前是 18(八进制的 022)。
  • 更好:调用 /o umask(027)
  • 对于关注者,调用/o 输出八进制,如 022
【解决方案2】:

从 Linux 内核 4.7 开始,umask 在/proc/&lt;pid&gt;/status 中可用。

【讨论】:

  • 你的 3.10.0:也许。在主线 3.10.0:没有。
  • 在 RHEL7.4 的内核 3.10.0-862.3.2.el7.x86_64 中。
【解决方案3】:

来自 GNU C 库手册:

这是一个示例,显示如何使用 umask 读取掩码 无需永久更改:

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

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

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

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

【讨论】:

  • 是的,getumask 仅适用于赫德。 Linux 手册页有这个有用的说明:这个函数记录在 glibc 手册中,但是,在 glibc 2.24 版中,它没有在 Linux 上实现。
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-16
      • 1970-01-01
      • 1970-01-01
      • 2011-07-11
      相关资源
      最近更新 更多