Как проверить umask программы, которая в данный момент запущена?
[update: другой процесс, а не текущий процесс.]
Как проверить umask программы, которая в данный момент запущена?
[update: другой процесс, а не текущий процесс.]
Вы можете подключить 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.
Из руководства библиотеки 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
; по-видимому, что только Херд.
Начиная с ядра Linux 4.7, umask доступен в /proc/<pid>/status
.
Если вы являетесь текущим процессом, вы можете записать файл в /tmp и проверить его настройку. Лучшим решением является вызов umask (3), проходящий ноль - функция возвращает настройку перед вызовом, а затем reset обратно, передав это значение обратно в 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+)$/)'