2011-06-30 20 views
7

Estoy tratando de entender las banderas para el campo st_mode de la estructura estadística de ese comando stat, ¡pero estoy teniendo un momento tan difícil! He encontrado este ejemplo here, pero realmente no entiendo este fragmento de código:flags para st_mode of stat system call

if (mode & S_IRUSR) str[1] = 'r'; /* 3 bits for user */ 
if (mode & S_IWUSR) str[2] = 'w'; 
if (mode & S_IXUSR) str[3] = 'x'; 

if (mode & S_IRGRP) str[4] = 'r'; /* 3 bits for group */ 
if (mode & S_IWGRP) str[5] = 'w'; 
if (mode & S_IXGRP) str[6] = 'x'; 

if (mode & S_IROTH) str[7] = 'r'; /* 3 bits for other */ 
if (mode & S_IWOTH) str[8] = 'w'; 
if (mode & S_IXOTH) str[9] = 'x'; 

Sé que "&" es el operador AND, pero nada más. Ni siquiera sé qué preguntar.

PD: Perdón por las preguntas anteriores que hice. No sé cómo marcar una pregunta respondida o algo por el estilo :(

Respuesta

2

modo es bitfield que es una forma común de empacar datos. Piense en cada bit en el campo como un interruptor que se puede configurar . apagado o encendido para comprobar si el interruptor está activado, se comprueba para ver si el bit apropiado se ha creado usando el operador & puede configurar bits utilizando |. y claro ellos usando ~ bitwise operations

1

Bueno, el POSIX spec for <sys/stat.h>. enumera todo lo que puede aprender del campo st_mode de struct stat.

¿Su pregunta es "¿Qué puede decirme este campo?" "¿Cómo extraigo la información", o ambas cosas?

2

Es común en la programación del sistema operativo el uso de enteros sin signo para contener una serie de bits que describen algo. En este caso, el modo tiene 9 bits de interés. Un bit dice si el propietario puede leer, uno para la escritura del propietario, uno para la ejecución del propietario y bits similares para el grupo y otros. El truco está en extraer si un bit está configurado o no.

Aquí hay un ejemplo. El S_IRUSR es un nombre para una máscara de bits que describe el bit "propietario leído". Se define en the specs como 0400 (octal) que se traduce a 100000000 en binario. Cuando toma el binario y de este valor con la máscara, obtiene el valor 100000000 (binario) si se establece el noveno bit de la máscara. De lo contrario, obtienes 0.

La instrucción if se evalúa como verdadera si se devuelve el valor grande, y de lo contrario es falso. De esta forma, si el bit está configurado, 'r' se escribe en la cadena en la posición 1. La misma técnica se aplica a todos los otros bits también.

+0

Gracias, no sabía que era octal, ¡así que mi programa no funcionó! :-) – Gandaro