2008-10-03 2 views
24

Как проверить umask программы, которая в данный момент запущена?linux: получение umask уже запущенного процесса?

[обновление:. Другой процесс, а не текущий процесс]

+0

Из текущего процесса? Или иностранный процесс? – 2008-10-03 00:26:34

+0

Прошло некоторое время [https://lkml.org/lkml/2012/5/4/451], чтобы сообщить о процессе 'umask в `/ proc/pid/status` и `/ proc/pid/stat`. Но он, похоже, не попал в ядро ​​mainline. – 2015-11-18 04:13:19

+0

Тот же вопрос на [unix.se]: [Текущий umask процесса с pid] (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)

Это говорит о том, что там может быть действительно некрасиво способ получить umask с использованием ptrace.

1

Если вы текущий процесс, вы можете записать файл в/TMP и проверьте его настройки. Лучшим решением является вызов umask (3), проходящий через ноль - функция возвращает настройку перед вызовом, а затем сбросит ее обратно, передав это значение обратно в umask.

umask для другого процесса, похоже, не отображается.

9

Из руководства GNU C Library:

Ниже приведен пример, показывающий, как читать маску с umask без изменения его навсегда:

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

Тем не менее, лучше использовать getumask если вы просто хотите прочитать значение маски, потому что оно реентерабельно (по крайней мере, если вы используете операционную систему GNU ).

getumask, однако, является glibc-specific. Поэтому, если вы цените переносимость, то единственным нерешенным решением является не-реентерабельное решение.

Редактировать: Я только что написал для ->umask весь исходный код Linux. Нигде это не даст вам 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.