【发布时间】:2010-09-14 23:29:49
【问题描述】:
如何查看当前正在运行的程序的 umask?
[更新:另一个进程,不是当前进程。]
【问题讨论】:
-
当前进程的?还是外国进程?
-
前段时间有一个patch,用于报告
/proc/pid/status和/proc/pid/stat中的进程'umask。但它似乎没有进入主线内核。
如何查看当前正在运行的程序的 umask?
[更新:另一个进程,不是当前进程。]
【问题讨论】:
/proc/pid/status 和/proc/pid/stat 中的进程'umask。但它似乎没有进入主线内核。
您可以将 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 可能有一种非常丑陋的方法。
【讨论】:
$1 = 18 行表示进程 umask 以前是 18(八进制的 022)。
022
从 Linux 内核 4.7 开始,umask 在/proc/<pid>/status 中可用。
【讨论】:
来自 GNU C 库手册:
这是一个示例,显示如何使用
umask读取掩码 无需永久更改:mode_t read_umask (void) { mode_t mask = umask (0); umask (mask); return mask; }但是,如果您只是想阅读,最好使用
getumask掩码值,因为它是可重入的(至少如果您使用 GNU 操作系统)。
getumask 是 glibc 特有的。因此,如果您重视可移植性,那么不可重入解决方案是唯一的解决方案。
编辑:我刚刚通过 Linux 源代码搜索了->umask。没有任何地方可以为您提供不同进程的 umask。另外,没有getumask;显然这是赫德唯一的事情。
【讨论】:
如果您是当前进程,您可以将文件写入 /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+)$/)'
【讨论】: