martes, 9 de marzo de 2010

SYS_SYSCTL

LEE/ESCRIBE PARÁMETROS DEL SISTEMA


USO
#include <unistd.h>
#include <linux/sysctl.h>

int _sysctl(struct __sysctl_args *args);



DESCRIPCIÓN
La llamada _sysctl lee o escribe parámetros del kernel.
Por ejemplo, el nombre del equipo, o el número máximo de ficheros abiertos.

El argumento que recibe tiene la siguiente forma:

struct __sysctl_args {
int *name; /* vector describiendo la variable */
int nlen; /* longitud de este vector */
void *oldval; /* 0 ó dir. donde guardar valor antiguo */
size_t *oldlenp; /* sitio disponible para el valor antiguo,
sobrescrito por el tamaño real de dicho valor */
void *newval; /* 0 ó dirección del nuevo valor */
size_t newlen; /* tamaño del nuevo valor */
};


Tras una terminación exitosa, _sysctl devuelve 0. En otro caso, se devuelve el valor -1 y se pone en errno un valor que indica el error.


EJEMPLO

#define _GNU_SOURCE
#include <unistd.h>
#include <sys/syscall.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <linux/sysctl.h>

int _sysctl(struct __sysctl_args *args );

#define OSNAMESZ 100

int
main(void)
{
struct __sysctl_args args;
char osname[OSNAMESZ];
size_t osnamelth;
int name[] = { CTL_KERN, KERN_OSTYPE };

memset(&args, 0, sizeof(struct __sysctl_args));
args.name = name;
args.nlen = sizeof(name)/sizeof(name[0]);
args.oldval = osname;
args.oldlenp = &osnamelth;

osnamelth = sizeof(osname);

if (syscall(SYS__sysctl, &args) == -1) {
perror("_sysctl");
exit(EXIT_FAILURE);
}
printf("Este equipo usa el kernel %*s\n", osnamelth, osname);
exit(EXIT_SUCCESS);
}

SALIDA:

~$ ./a.out
Este equipo usa el kernel Linux



NOTA
Esta llamada es específica de Linux, y no debería emplearse en programas 'portables'.

No hay comentarios:

Publicar un comentario