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:
#incluirStat 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
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:
- st_dev: Es el ID del dispositivo en el que tenemos nuestro archivo que reside actualmente.
- st_rdev: Este campo describe que un archivo en particular representa un dispositivo en particular.
- 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
- st_size: st_size es el tamaño del archivo en bytes.
- st_atime: Es la última vez o la hora reciente a la que se accedió al archivo.
- st_ctime: Es la hora reciente en la que se cambió el estado o los permisos del archivo.
- st_mtime: Es la hora reciente en la que se modificó el archivo.
- 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.
- st_blocks: Este campo indica el número total de bloques en múltiplos de 512 bytes.
- st_nlink: Este campo indica el número total de enlaces físicos.
- st_uid: Este campo indica el ID de usuario.
- st_gid: Este campo indica el ID del grupo.
- 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
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.