linux: ¿obteniendo umask de un proceso ya en ejecución?


¿Cómo puedo comprobar la máscara de un programa que se está ejecutando actualmente?

[update: otro proceso, no el actual.]

Author: Mark Harrison, 0000-00-00

5 answers

Puede adjuntar gdb a un proceso en ejecución y luego llamar a umask en el depurador:

(gdb) call umask(0)
[Switching to Thread -1217489200 (LWP 11037)]
$1 = 18
(gdb) call umask(18)
$2 = 0
(gdb) 

(nota: 18 = O22)

Esto sugiere que puede haber una forma realmente fea de obtener la máscara umask usando ptrace.

 25
Author: Mark Harrison,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-28 20:04:20

Del manual de la Biblioteca C de GNU:

Aquí hay un ejemplo que muestra cómo leer la máscara con umask sin cambiarlo permanentemente:

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

Sin embargo, es mejor usar getumask si solo quieres leer el valor de la máscara, porque es reentrante (al menos si utiliza el Sistema operativo GNU).

getumask es específico de glibc, sin embargo. Así que si valoramos la portabilidad, entonces la solución no reentrante es la única que existe.

Editar: Acabo de greped para ->umask todo a través del código fuente de Linux. No hay ningún lugar que le dará la máscara de un proceso diferente. Además, no hay getumask; aparentemente eso es solo una cosa de Hurd.

 9
Author: Chris Jester-Young,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-03 04:18:26

Comenzando con el kernel de Linux 4.7, el umask está disponible en /proc/<pid>/status.

 3
Author: egmont,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-28 10:14:52

Si eres el proceso actual, puedes escribir un archivo en /tmp y comprobar su configuración. Una mejor solución es llamar a umask (3) pasando cero - la función devuelve la configuración anterior a la llamada - y luego restablecerla volviendo a pasar ese valor a umask.

La máscara umask para otro proceso no parece estar expuesta.

 1
Author: Josh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-03 01:04:54

Un colega acaba de mostrarme un patrón de línea de comandos para esto. Siempre tengo emacs funcionando, así que eso está en el siguiente ejemplo. El perl es mi contribución:

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+)$/)'
 0
Author: tbc0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-09 22:14:57