2008-10-03 570 views
24

如何檢查當前正在運行的程序的umask?linux:獲取已經運行的進程的umask?

[更新:另一個進程,而不是當前進程]

+0

當前進程?還是一個外國程序? – 2008-10-03 00:26:34

+0

前段時間有一個[補丁](https://lkml.org/lkml/2012/5/4/451)報告了進程'/ proc/pid/status中的umask'和`/ proc/pid/stat`。但它似乎沒有進入主線內核。 – 2015-11-18 04:13:19

+0

[unix.se]上的同一問題:[當前pid進程的umask](http://unix.stackexchange.com/q/258284) – 2016-01-29 23:06:52

回答

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

如果你當前的進程,你可以寫一個文件到/ tmp,並檢查其設置。一個更好的解決方案是調用umask(3)傳遞零 - 該函數返回調用之前的設置 - 然後通過將該值傳遞迴umask將其重置。

另一個進程的umask似乎沒有公開。

9

從GNU C庫手冊:

這裏是示出如何使用umask 讀掩模不會永久改變其一個例子:

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

然而,最好是使用getumask如果您只想讀取 掩碼值,因爲它是可重入的(至少如果您使用的是GNU操作系統的 )。

getumask是glibc特定的,但。所以如果你重視可移植性,那麼非重入式解決方案是唯一的解決方案。

編輯:我剛剛通過Linux源代碼grep爲->umask。沒有任何地方會讓你獲得另一個過程的祕密。此外,沒有getumask;顯然這是一個赫德唯一的事情。

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+)$/)' 
2

與Linux內核4.7開始,umask是在/proc/<pid>/status可用。