Как проверить umask программы, которая в данный момент запущена?linux: получение umask уже запущенного процесса?
[обновление:. Другой процесс, а не текущий процесс]
Как проверить umask программы, которая в данный момент запущена?linux: получение umask уже запущенного процесса?
[обновление:. Другой процесс, а не текущий процесс]
Вы можете прикрепить 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.
Если вы текущий процесс, вы можете записать файл в/TMP и проверьте его настройки. Лучшим решением является вызов umask (3), проходящий через ноль - функция возвращает настройку перед вызовом, а затем сбросит ее обратно, передав это значение обратно в umask.
umask для другого процесса, похоже, не отображается.
Из руководства GNU C Library:
Ниже приведен пример, показывающий, как читать маску с
umask
без изменения его навсегда:mode_t read_umask (void) { mode_t mask = umask (0); umask (mask); return mask; }
Тем не менее, лучше использовать
getumask
если вы просто хотите прочитать значение маски, потому что оно реентерабельно (по крайней мере, если вы используете операционную систему GNU ).
getumask
, однако, является glibc-specific. Поэтому, если вы цените переносимость, то единственным нерешенным решением является не-реентерабельное решение.
Редактировать: Я только что написал для ->umask
весь исходный код Linux. Нигде это не даст вам umask другого процесса. Кроме того, нет getumask
; по-видимому, это только Хэрд.
Коллега просто показал мне шаблон командной строки для этого. У меня всегда есть 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+)$/)'
Начиная с Linux ядра 4.7, то Umask доступен в /proc/<pid>/status
.
Из текущего процесса? Или иностранный процесс? – 2008-10-03 00:26:34
Прошло некоторое время [https://lkml.org/lkml/2012/5/4/451], чтобы сообщить о процессе 'umask в `/ proc/pid/status` и `/ proc/pid/stat`. Но он, похоже, не попал в ядро mainline. – 2015-11-18 04:13:19
Тот же вопрос на [unix.se]: [Текущий umask процесса с pid] (http://unix.stackexchange.com/q/258284) – 2016-01-29 23:06:52