¿Cómo puedo verificar umask de un programa que se está ejecutando actualmente?linux: ¿obteniendo umask de un proceso ya en ejecución?
[actualización. Otro proceso, no el proceso actual]
¿Cómo puedo verificar umask de un programa que se está ejecutando actualmente?linux: ¿obteniendo umask de un proceso ya en ejecución?
[actualización. Otro proceso, no el proceso actual]
Puede adjuntar gdb a un proceso que se ejecuta y luego llamar máscara de usuario 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 ser una manera muy fea para obtener el umask usando ptrace.
Si usted es el proceso actual, se puede escribir un archivo en/tmp y comprobar su ajuste. Una mejor solución es llamar a umask (3) pasando el cero - la función devuelve el ajuste antes de la llamada - y luego reiniciarlo volviendo a pasar ese valor a umask.
La umask de otro proceso no parece estar expuesta.
Desde el manual de GNU C Library:
Aquí es un ejemplo que muestra cómo leer la máscara con
umask
sin cambiar de forma permanente:mode_t read_umask (void) { mode_t mask = umask (0); umask (mask); return mask; }
Sin embargo, es mejor utilizar
getumask
si solo quiere leer el valor de la máscara, porque es reentrante (al menos si usa el sistema operativo GNU ).
getumask
es específico de glibc. Entonces, si valora la portabilidad, entonces la solución sin reentrada es la única que existe.
Editar: Acabo de analizar para ->umask
todo a través del código fuente de Linux. No hay ningún lugar que te traiga la máscara de un proceso diferente. Además, no hay getumask
; aparentemente eso es solo cosa de Hurd.
Sí, getumask solo está en Hurd. La página del manual de Linux tiene esta útil nota: esta función está documentada en el manual de glibc, pero, como en la versión 2.24 de glibc, no está implementada en Linux. –
Un colega me acaba de mostrar un patrón de línea de comandos para esto. Siempre tengo emacs en ejecución, así que eso está en el ejemplo de abajo. 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+)$/)'
Comenzando con el kernel Linux 4.7, la máscara de usuario está disponible en /proc/<pid>/status
.
del proceso actual? O un proceso extraño? –
Hubo un [parche] (https://lkml.org/lkml/2012/5/4/451) que pasó por esto hace un tiempo, para informar el proceso 'umask en '/ proc/pid/status' y '/ proc/pid/stat'. Pero no parece haber ido al núcleo de la línea principal. –
La misma pregunta en [unix.se]: [Umask actual de un proceso con pid] (http://unix.stackexchange.com/q/258284) –