2008-10-03 15 views
24

¿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]

+0

del proceso actual? O un proceso extraño? –

+0

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. –

+0

La misma pregunta en [unix.se]: [Umask actual de un proceso con pid] (http://unix.stackexchange.com/q/258284) –

Respuesta

25

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.

+1

Gracias! y gratitud extra por el recordatorio de restablecer la umask. –

+2

Si está confundido como yo, la línea '$ 1 = 18' significa que el proceso umask anteriormente era 18 (022 en octal). – njahnke

+1

Mejor: call/o umask (027) – MarcH

1

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.

9

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.

+0

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. –

0

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+)$/)' 
2

Comenzando con el kernel Linux 4.7, la máscara de usuario está disponible en /proc/<pid>/status.

Cuestiones relacionadas