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; по-видимому, это единственное препятствие.


начиная с ядра Linux 4.7, umask доступен в /proc/<pid>/status.


Если вы текущий процесс, вы можете написать файл в /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+)$/)'