Подтвердить что ты не робот

Linux: получение umask уже запущенного процесса?

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

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

4b9b3361

Ответ 1

Вы можете подключить 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.

Ответ 2

Из руководства библиотеки 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; по-видимому, что только Херд.

Ответ 3

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

Ответ 4

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

umask для другого процесса, похоже, не отображается.

Ответ 5

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