Llamadas al sistema

Tutorial de Stat System Call Linux

Tutorial de Stat System Call Linux

Llamadas al sistema Linux

Las llamadas al sistema proporcionadas por el kernel de Linux se exponen en el lenguaje de programación C a través de glibc.  Cuando se utiliza una llamada al sistema, se está comunicando con el sistema operativo y, a su regreso, el sistema operativo se comunica con usted a través de los parámetros que se devuelven a las funciones de llamada al sistema (valores de retorno).

Llamada al sistema de estadísticas:

La llamada al sistema Stat es una llamada al sistema en Linux para verificar el estado de un archivo, como para verificar cuándo se accedió al archivo. La llamada al sistema stat () en realidad devuelve atributos de archivo. Los atributos de archivo de un inodo son básicamente devueltos por la función Stat (). Un inodo contiene los metadatos del archivo. Un inodo contiene: el tipo de archivo, el tamaño del archivo, cuándo se accedió al archivo (modificado, eliminado) que son marcas de tiempo, y la ruta del archivo, el ID de usuario y el ID de grupo, enlaces del archivo y dirección física del contenido del archivo.

Podemos decir que el inodo contiene todos los datos que se requieren para la llamada al sistema stat () y es el número de índice del archivo que se guarda en la tabla de inodo. Siempre que crea un archivo, se crea un número de inodo para ese archivo. Usando la llamada al sistema de estadísticas, las tablas del sistema pueden verse.

Sintaxis de la llamada al sistema C Stat:

Para usar la llamada al sistema de estadísticas en el lenguaje de programación C, debe incluir el siguiente archivo de encabezado:

#incluir

Stat se usa para obtener el estado de un archivo. La sintaxis de la llamada al sistema C stat puede no ser la misma para todos los sistemas operativos. En Linux, la sintaxis para la llamada al sistema de estadísticas es la siguiente:

int stat (const char * ruta, struct stat * buf)

El tipo de retorno de la función en En t, si la función se ejecuta con éxito, se devuelve 0 si hay algún error, se devolverá -1.

Aquí const char * ruta especifica el nombre del archivo. Si la ruta del archivo es un enlace simbólico, debe especificar el enlace en lugar del nombre del archivo.

Entonces en la función tenemos un estructura estadística en el que se almacenan los datos o la información sobre el archivo que utiliza un puntero llamado buf, que se pasa como un parámetro y se completa durante la ejecución de la llamada y es legible por el usuario después de la llamada.

Estructura estadística:

La estructura estadística que se define en El archivo de encabezado contiene los siguientes campos:

estadística de estructura

mode_t st_mode;
ino_t st_ino;
dev_t st_dev;
dev_t st_rdev;
nlink_t st_nlink;
uid_t st_uid;
gid_t st_gid;
off_t st_size;
struct timspec st_atim;
struct timspec st_mtim;
struct timspec st_ctim;
blksize_t st_blksize;
blkcnt_t st_blocks;
;

Descripción:

  1. st_dev: Es el ID del dispositivo en el que tenemos nuestro archivo que reside actualmente.
  2. st_rdev: Este campo describe que un archivo en particular representa un dispositivo en particular.
  3. st_ino: Es el número de inodo o el número de serie del archivo. Como es un número de índice, debería ser único para todos los archivos
  4. st_size: st_size es el tamaño del archivo en bytes.
  5. st_atime: Es la última vez o la hora reciente a la que se accedió al archivo.
  6. st_ctime: Es la hora reciente en la que se cambió el estado o los permisos del archivo.
  7. st_mtime: Es la hora reciente en la que se modificó el archivo.
  8. st_blksize: Este campo proporciona el tamaño de bloque preferido para el sistema de archivos de E / S, que puede variar de un archivo a otro.
  9. st_blocks: Este campo indica el número total de bloques en múltiplos de 512 bytes.
  10. st_nlink: Este campo indica el número total de enlaces físicos.
  11. st_uid: Este campo indica el ID de usuario.
  12. st_gid: Este campo indica el ID del grupo.
  13. st_mode: Indica los permisos en el archivo, dice los modos en un archivo. A continuación se muestran las banderas que deben definirse para el campo st_mode:
Banderas Descripción Valor de la bandera
S_IFMT Una máscara de bits utilizada para obtener el valor de modo de un archivo 0170000
S_IFSOCK Una constante de archivo de socket 0140000
S_IFLINK Una constante de archivo de enlace simbólico 0120000
S_IFREG Constante de archivo para archivo normal 0100000
S_IFBLK Constante de archivo para archivo de bloque 0060000
S_IFDIR Constante de archivo para archivo de directorio 0040000
S_IFCHR Constante de archivo para archivo de caracteres 0020000
S_IFIFO Una constante de archivo de quince 0010000
S_ISUID Establecer bit de ID de usuario 0004000
S_ISGID Establecer bit de ID de grupo 0002000
S_ISVTX Bit pegajoso que indica texto compartido 0001000
S_IRWXU Permisos de propietario (lectura, escritura, ejecución) 00700
S_IRUSR Leer permisos para el propietario 00400
S_IWUSR Permisos de escritura para el propietario 00200
S_IXUSR Ejecutar permisos para el propietario 00100
S_IRWXG Permisos de grupo (lectura, escritura, ejecución) 00070
S_IRGRP Leer permisos para el grupo 00040
S_IWGRP Permisos de escritura para el grupo 00020
S_IXGRP Ejecutar permisos para el grupo 00010
S_IRWXO Permisos para otros (leer, escribir, ejecutar) 00007
S_IROTH Leer permisos para otros 00004
S_IWOTH Permisos de escritura para otros 00002
S_IXOTH Ejecutar permisos para otros 00001

Cómo utilizar la llamada al sistema Stat:

El siguiente ejemplo muestra cómo usar la llamada al sistema stat en el lenguaje de programación C en Linux, Ubuntu.

EJEMPLO 1:

En el siguiente código vamos a encontrar el modo de un archivo:

CÓDIGO:

#incluir
#incluir
int main ()

// puntero a la estructura estadística
struct stat sfile;
// llamada al sistema estadístico
stat ("stat.c ", & sfile);
// acceder a st_mode (miembro de datos de la estructura stat)
printf ("st_mode =% o", sfile.st_mode);
return 0;

La compilación y ejecución del programa devuelve el siguiente resultado:

En este código, hemos pasado el nombre del archivo en la llamada al sistema de estadísticas y luego el puntero a la estructura de estadísticas que es sfile. El puntero a la estructura estadística se usa para acceder a st_mode, que muestra el modo del archivo usando la declaración printf.

El archivo de encabezado se usa para que pueda usar la llamada al sistema de estadísticas. El archivo de encabezado es el archivo de biblioteca de entrada / salida estándar para que pueda usar printf o scanf en su código C.

EJEMPLO 2:

En el siguiente código vamos a obtener información sobre el archivo usando la llamada al sistema stat:

CÓDIGO:

#incluir
#incluir
#incluir
#incluir
void sfile (char const nombre de archivo []);
int main ()
ssize_t read;
char * buffer = 0;
size_t buf_size = 0;
printf ("Ingrese el nombre de un archivo para verificar: \ n");
read = getline (& buffer, & buf_size, stdin);
si (leer <=0 )
printf ("error de getline \ n");
salida (1);

if (buffer [lectura-1] == '\ n')
búfer [lectura-1] = 0;

int s = open (búfer, O_RDONLY);
si (s == - 1)
printf ("El archivo no existe \ n");
salida (1);

demás
sfile (búfer);

libre (búfer);
return 0;

void sfile (char const filename [])
struct stat sfile;
if (stat (nombre de archivo, & sfile) == - 1)
printf ("Ocurrió un error \ n");

// Accediendo a los miembros de datos de la estructura estadística
printf ("\ nFile st_uid% d \ n", sfile.st_uid);
printf ("\ nFile st_blksize% ld \ n", sfile.st_blksize);
printf ("\ nFile st_gid% d \ n", sfile.st_gid);
printf ("\ nFile st_blocks% ld \ n", sfile.st_blocks);
printf ("\ nTamaño_est_archivo% ld \ n", sfile.st_size);
printf ("\ nFile st_nlink% u \ n", (unsigned int) sfile.st_nlink);
printf ("\ nusuario de permisos de archivo \ n");
printf ((sfile.st_mode y S_IRUSR)? "r": "-");
printf ((sfile.st_mode y S_IWUSR)? "w": "-");
printf ((sfile.st_mode y S_IXUSR)? "X":"-");
printf ("\ n");
printf ("\ nGrupo de permisos de archivos \ n");
printf ((sfile.st_mode y S_IRGRP)? "r": "-");
printf ((sfile.st_mode y S_IWGRP)? "w": "-");
printf ((sfile.st_mode y S_IXGRP)? "X":"-");
printf ("\ n");
printf ("\ nOtros permisos de archivo \ n");
printf ((sfile.st_mode y S_IROTH)? "r": "-");
printf ((sfile.st_mode y S_IWOTH)? "w": "-");
printf ((sfile.st_mode y S_IXOTH)? "X":"-");
printf ("\ n");

PRODUCCIÓN:

En el código C anterior, hemos ingresado el nombre del archivo y si el archivo no existe, la ejecución del programa se detendrá. Esto se demuestra en la siguiente imagen:

Si nuestro archivo existe, se llamará a la función sfile (n) en la que hemos pasado el nombre del archivo. Dentro de la función, en primer lugar hemos utilizado la llamada al sistema Stat, si stat () devuelve -1, entonces debe haber algún error para que se imprima un mensaje y se detenga la ejecución del programa.

Luego, en la declaración printf, hemos usado el nombre de la función y el separador de puntos para acceder a los miembros de datos de estructura estadística.

Luego para el modo de archivo hemos accedido a las macros o banderas de st_mode. Aquí el operador lógico y se utiliza para imprimir los modos respectivos. Hemos verificado los permisos de usuario, grupo y otros para el archivo especificado (nombre de archivo ingresado por el usuario).

Con esto, puede ver cómo usar la llamada al sistema stat desde el lenguaje de programación C para obtener información del kernel del sistema operativo sobre los archivos.  Si tiene alguna pregunta, no dude en comunicárnoslo a través de la sección de comentarios.

Los mejores juegos de línea de comandos para Linux
La línea de comandos no es solo su mayor aliado cuando usa Linux, también puede ser la fuente de entretenimiento porque puede usarla para jugar muchos...
Las mejores aplicaciones de mapeo de gamepad para Linux
Si te gusta jugar juegos en Linux con un gamepad en lugar de un sistema de entrada de teclado y mouse típico, hay algunas aplicaciones útiles para ti....
Herramientas útiles para jugadores de Linux
Si le gusta jugar juegos en Linux, es probable que haya utilizado aplicaciones y utilidades como Wine, Lutris y OBS Studio para mejorar la experiencia...