Linux: получить Umask уже запущенного процесса? - PullRequest
25 голосов
/ 03 октября 2008

Как я могу проверить umask программы, которая в данный момент работает?

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

Ответы [ 5 ]

25 голосов
/ 03 октября 2008

Вы можете присоединить 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.

9 голосов
/ 03 октября 2008

Из руководства библиотеки GNU C:

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

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

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

getumask, однако, зависит от glibc. Так что, если вы цените мобильность, то решение, не входящее в систему, является единственным.

Редактировать: Я только что нашел ->umask во всем исходном коде Linux. Нет нигде, что принесло бы вам маску другого процесса. Также нет getumask; по-видимому, это только для Херда.

4 голосов
/ 28 марта 2017

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

1 голос
/ 03 октября 2008

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

Кажется, что umask для другого процесса не выставлен.

0 голосов
/ 10 августа 2016

Коллега только что показал мне шаблон командной строки для этого. У меня всегда работает 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+)$/)'
...