Linux: получение umask уже запущенного процесса?
Как проверить umask программы, которая в данный момент запущена?
[update: другой процесс, а не текущий процесс.]
Ответы
Ответ 1
Вы можете подключить 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.
Ответ 2
Из руководства библиотеки GNU C:
Вот пример, показывающий, как читать маску с помощью umask
не меняя его навсегда:
mode_t
read_umask (void)
{
mode_t mask = umask (0);
umask (mask);
return mask;
}
Однако лучше использовать getumask
, если вы просто хотите прочитать значение маски, поскольку оно является реентерабельным (по крайней мере, если вы используете GNU).
getumask
является glibc-специфическим. Поэтому, если вы цените переносимость, то не реентерабельное решение является единственным.
Изменить: я только что сделал grepped для ->umask
через исходный код Linux. Нигде это не даст вам umask другого процесса. Кроме того, нет getumask
; по-видимому, что только Херд.
Ответ 3
Начиная с ядра Linux 4.7, umask доступен в /proc/<pid>/status
.
Ответ 4
Если вы являетесь текущим процессом, вы можете записать файл в /tmp и проверить его настройку. Лучшим решением является вызов umask (3), проходящий ноль - функция возвращает настройку перед вызовом, а затем reset обратно, передав это значение обратно в 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+)$/)'