如何检查当前正在运行的程序的umask?[更新:另一个进程,不是当前进程。]
nzk0hqpo1#
您可以将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)
(note:18对应于本示例中O22的umask)这表明使用ptrace获取umask的方法可能非常丑陋。
O22
cdmah0mi2#
从Linux内核4.7开始,umask在/proc/<pid>/status中可用。
/proc/<pid>/status
vsdwdz233#
从GNU C Library手册:下面是一个示例,展示了如何读取umask的掩码,而不永久更改它:
umask
mode_t read_umask (void) { mode_t mask = umask (0); umask (mask); return mask; }
但是,如果您只想读取掩码值,最好使用getumask,因为它是可重入的(至少如果您使用GNU操作系统)。getumask是特定于glibc的。因此,如果您重视可移植性,那么非可重入解决方案是唯一的解决方案。编辑:我刚刚在整个Linux源代码中对->umask进行了grepped。没有任何地方能让你感受到不同过程的味道。也没有getumask;显然这是赫德的专利
getumask
->umask
i86rm4rw4#
如果你是当前进程,你可以写一个文件到/tmp并检查它的设置。一个更好的解决方案是调用umask(3),传递0-函数返回调用之前的设置-然后通过将该值传递回umask来重置它。另一个进程的umask似乎没有暴露。
o2g1uqev5#
一位同事刚刚向我展示了这个命令行模式。我总是让emacs运行,所以在下面的例子中。perl是我的贡献:
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+)$/)'
3okqufwl6#
至少在Kernel 4.18中,有一个搜索status proc文件的选项:grep Umask /proc/<PID>/status
grep Umask /proc/<PID>/status
6条答案
按热度按时间nzk0hqpo1#
您可以将gdb附加到正在运行的进程,然后在调试器中调用umask:
(note:18对应于本示例中
O22
的umask)这表明使用ptrace获取umask的方法可能非常丑陋。
cdmah0mi2#
从Linux内核4.7开始,umask在
/proc/<pid>/status
中可用。vsdwdz233#
从GNU C Library手册:
下面是一个示例,展示了如何读取
umask
的掩码,而不永久更改它:但是,如果您只想读取掩码值,最好使用
getumask
,因为它是可重入的(至少如果您使用GNU操作系统)。getumask
是特定于glibc的。因此,如果您重视可移植性,那么非可重入解决方案是唯一的解决方案。编辑:我刚刚在整个Linux源代码中对
->umask
进行了grepped。没有任何地方能让你感受到不同过程的味道。也没有getumask
;显然这是赫德的专利i86rm4rw4#
如果你是当前进程,你可以写一个文件到/tmp并检查它的设置。一个更好的解决方案是调用umask(3),传递0-函数返回调用之前的设置-然后通过将该值传递回umask来重置它。
另一个进程的umask似乎没有暴露。
o2g1uqev5#
一位同事刚刚向我展示了这个命令行模式。我总是让emacs运行,所以在下面的例子中。
perl
是我的贡献:3okqufwl6#
至少在Kernel 4.18中,有一个搜索status proc文件的选项:
grep Umask /proc/<PID>/status