linux: получение umask уже запущенного процесса?
Как я могу проверить umask программы, которая в настоящее время работает?
[update: другой процесс, а не текущий процесс.]
5 ответов
вы можете присоединить gdb к запущенному процессу, а затем вызвать umask в отладчике:
(gdb) call umask(0)
[Switching to Thread -1217489200 (LWP 11037)]
= 18
(gdb) call umask(18)
= 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-разному. Так что если вы цените мобильность, то нереентерабельные решение является единственным там есть.
Edit: я только что grepped для ->umask
все через исходный код Linux. Нет нигде, что даст вам umask другого процесса. Кроме того, нет getumask
; по-видимому, это единственное препятствие.
Если вы текущий процесс, вы можете написать файл в /tmp и проверить его настройку. Лучшим решением является вызов umask (3), передающий ноль - функция возвращает настройку до вызова - а затем сбрасывает ее обратно, передавая это значение обратно в umask.
umask для другого процесса, похоже, не подвергается воздействию.
коллега только что показал мне образец командной строки для этого. У меня всегда работает emacs, так что это в примере ниже. The perl
мой вклад:
sudo gdb --pid=$(pgrep emacs) --batch -ex 'call/o umask(0)' -ex 'call umask()' 2> /dev/null | perl -ne 'print("\n")if(/^$1 = (\d+)$/)'