Reglamento general de los foros   •   FAQ   •   Buscar en el foro •  Registrarse | Iniciar sesión 



Foros Linux » Desarrollo » Programación


Nuevo tema Responder al tema
 [ 8 mensajes ] 
Patrocinadores

Autor
Buscar:
Mensaje

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Mar Nov 29, 2011 6:27 am
Mensajes: 4

Nota Publicado: Mar Nov 29, 2011 6:38 am 
Arriba  
Hola

estoy programando en c++ y necesito hacer una llamada al sistema con el comando uname. Mi código es el siguiente:
Código:

struct utsname{
      char sysname[];
      char nodename[];
      char release[];
      char machine[];
      char version[];
      #ifdef _GNU_SOURCE
      char domainname[];   
      #endif
   }*uts;
   
   uts=new utsname();
   
   resul=syscall(SYS_uname,uts);
   
   cout<<"-------------------------------UNAME--------------------------------------"<<endl;
   cout<<"Codigo de retorno = " << resul <<endl;
   cout<<"Nombre del sistema operativo: "<<uts->sysname<<endl;
   cout<<"Nombre del equipo en la red: "<<uts->nodename<<endl;
   cout<<"Liberación del SO (fecha): "<<uts->release<<endl;
   cout<<"Versión SO: "<<uts->version<<endl;
   cout<<"Identificador de hardware: "<<uts->machine<<endl;
   cout<<"Dominio: "<<uts->domainname<<endl;
   cout<<"\n\n"<<endl;



la salida por pantalla del mismo es que en cada campo de la struct me escribe 'Linux' (al no llevar modificadores solo imprime en nombre del OS, por tanto lo pone en cada campo de la struct).

El problema es que para obtener toda la información que da el comando uname es necesario usarlo junto con un modificador (exactamente -a), pero no encuentro la manera de pasarselo-indicárselo a la llamada syscall.

¿Alguien podría decirme cómo se hace?

gracias de antemano

 Perfil Email  

Desconectado
Moderador
Moderador
Avatar de Usuario

Registrado: Mié Nov 28, 2007 12:00 am
Mensajes: 1361
Ubicación: En la X del explorer (pulse para llamar)

Nota Publicado: Mié Nov 30, 2011 3:22 pm 
Arriba  
He encontrado varias librerías de syscall por internet, concretamente los .h, pero no el código en c++ con lo que no puedo ayudar. Supuestamente sí se pueden pasar parámetros, pero no he encontrado cómo.

Yo usaría la función "system" si es posible. Al menos de esa forma ejecutarías el comando.

_________________
Descargue el gestor de mp3 "Music Manager" -> (mmlf)
Última versión del gestor "Music Manager" -> (jmmm)

 Perfil  

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Mar Nov 29, 2011 6:27 am
Mensajes: 4

Nota Publicado: Jue Dic 01, 2011 12:56 pm 
Arriba  
muchas gracias akodo. Y otra preguntilla, que son "stubs"? Lo pregunto porque indagando por la unistd_64.h he visto esto:
Código:
#ifndef __NO_STUBS
#define __ARCH_WANT_OLD_READDIR
#define__ARCH_WANT_SYS_GETHOSTNAME
......
......

#endif


Por mas que busco no encuentro saco nada en claro a lo que se referiere.
Saludos y gracias

 Perfil Email  

Desconectado
Forista Nuevo
Forista Nuevo
Avatar de Usuario

Registrado: Sab Dic 19, 2009 7:33 pm
Mensajes: 36

Nota Publicado: Vie Dic 02, 2011 10:00 am 
Arriba  
El código está bien, tu problema es que estas usando una definición incorrecta de la estructura utsname. Simplemente debes incluir <sys/utsname.h> en tu código y luego obtener tu variable con utsname *uts=new utsname();.

En resumen: _NUNCA_ redefinas una estructura del sistema si esta ya existe en los includes del sistema, eso solo causa problemas. Por si quedan dudas:

Código:
Codigo de retorno = 0
Nombre del sistema operativo: Linux
Nombre del equipo en la red: hatsune
Liberación del SO (fecha): 3.1.1-ck2
Versión SO: #1 SMP PREEMPT Tue Nov 15 21:31:23 VET 2011
Identificador de hardware: x86_64
Dominio: (none)

_________________
Just feel the code...

 Perfil Email  

Desconectado
Moderador
Moderador
Avatar de Usuario

Registrado: Mié Abr 18, 2007 11:00 pm
Mensajes: 1209
Ubicación: Cojutepeque, El Salvador C. A.

Nota Publicado: Vie Dic 02, 2011 10:08 am 
Arriba  
ne, discupen que haga offtopic y spam xD, pero, codestation, espero puedas participar en el concurso de screenshots de este año

_________________
Grüße...
Maiku

Full linux alchemist!!!

 Perfil WWW  

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Mar Nov 29, 2011 6:27 am
Mensajes: 4

Nota Publicado: Vie Dic 02, 2011 1:17 pm 
Arriba  
codestation escribió:
El código está bien, tu problema es que estas usando una definición incorrecta de la estructura utsname. Simplemente debes incluir <sys/utsname.h> en tu código y luego obtener tu variable con utsname *uts=new utsname();.

En resumen: _NUNCA_ redefinas una estructura del sistema si esta ya existe en los includes del sistema, eso solo causa problemas. Por si quedan dudas:

Código:
Codigo de retorno = 0
Nombre del sistema operativo: Linux
Nombre del equipo en la red: hatsune
Liberación del SO (fecha): 3.1.1-ck2
Versión SO: #1 SMP PREEMPT Tue Nov 15 21:31:23 VET 2011
Identificador de hardware: x86_64
Dominio: (none)


Le has puesto la guinda al pastel. ¡¡Un millón de gracias!! Creo que esto va a solucionar muchos de mis problemas

Editado -- Vie Dic 02, 2011 1:11 pm --

:shock: :shock: :shock: :shock: :shock: :shock: :shock: :shock: :shock: :shock:

Tengo también en mi código una llamada a 'sysinfo' y sin redefinir la struct no funciona!El código es el siguiente:
Código:
/*struct sysinfo{
      long uptime;
      unsigned long loads[3];
      unsigned long totalram;
      unsigned long freeram;
      unsigned long sharedram;
      unsigned long bufferram;
      unsigned long totalswap;
      unsigned long freeswap;
      unsigned short procs;
      unsigned long totalhigh;
      unsigned long freehigh;
      unsigned int mem_unit;
      char _f[20-2*sizeof(long)-sizeof(int)];
   }info;*/
   
   sysinfo *info=new sysinfo();
    resul= syscall(SYS_sysinfo,info);
   
   cout<<"-------------------------------SYSINFO--------------------------------------"<<endl;
   cout<<"Codigo de retorno = " << resul <<endl;
    cout<<"Uptime = "<< info.uptime <<endl;
    cout<<"Carga 1 min  "<< info.loads[0] <<endl;
    cout<<"Carga 5 min = "<< info.loads[1] <<endl;
    cout<<"Carga 15 min = "<< info.loads[2] <<endl;
    cout<<"RAM total = "<< info.totalram <<endl;
    cout<<"libre = "<< info.freeram <<endl;
    cout<<"compartida = "<< info.sharedram <<endl;
    cout<<"Swap total = "<< info.totalswap <<endl;
   cout << "swap libre = "<<info.freeswap <<endl;
    cout<<"libre = "<< info.bufferram <<endl;
    cout<<"numero de procesos = "<< info.procs <<endl;
   cout<<"tamaño de memoria alta = "<< info.totalhigh <<endl;
   cout<<"tamaño de memoria alta libre en bytes = "<< info.freehigh <<endl;
   cout<<"tamaño memoria = "<< info.mem_unit <<endl;
   cout<<"\n"<<endl;


Haciendolo sin redefinir me salen errores en la linea 'sysinfo *info=new sysinfo();' diciendome que info no ha sido declarado, que falta un ; delante de sysinfo (esto es mentira) y tambien 'expected type-specifier before sysinfo.
Tengo incluida la <sys/sysinfo.h>.

No entiendo porque aquí la tengo que redefinir y sin embargo en la llamada de uname no.
Saludos

PD:La redifinición de la struct está comentada, por si se os ha pasado por alto

El código que me funciona a mi (o eso creo) es este:
Código:
int resul;
    struct sysinfo{
      long uptime;
      unsigned long loads[3];
      unsigned long totalram;
      unsigned long freeram;
      unsigned long sharedram;
      unsigned long bufferram;
      unsigned long totalswap;
      unsigned long freeswap;
      unsigned short procs;
      unsigned long totalhigh;
      unsigned long freehigh;
      unsigned int mem_unit;
      char _f[20-2*sizeof(long)-sizeof(int)];
   }info;
   
   //sysinfo *info=new sysinfo();
    resul= syscall(SYS_sysinfo,&info);
   
   cout<<"-------------------------------SYSINFO--------------------------------------"<<endl;
   cout<<"Codigo de retorno = " << resul <<endl;
    cout<<"Uptime = "<< info.uptime <<endl;
    cout<<"Carga 1 min  "<< info.loads[0] <<endl;
    cout<<"Carga 5 min = "<< info.loads[1] <<endl;
    cout<<"Carga 15 min = "<< info.loads[2] <<endl;
    cout<<"RAM total = "<< info.totalram <<endl;
    cout<<"libre = "<< info.freeram <<endl;
    cout<<"compartida = "<< info.sharedram <<endl;
    cout<<"Swap total = "<< info.totalswap <<endl;
   cout << "swap libre = "<<info.freeswap <<endl;
    cout<<"libre = "<< info.bufferram <<endl;
    cout<<"numero de procesos = "<< info.procs <<endl;
   cout<<"tamaño de memoria alta = "<< info.totalhigh <<endl;
   cout<<"tamaño de memoria alta libre en bytes = "<< info.freehigh <<endl;
   cout<<"tamaño memoria = "<< info.mem_unit <<endl;
   cout<<"\n"<<endl;
   

 Perfil Email  

Desconectado
Forista Nuevo
Forista Nuevo
Avatar de Usuario

Registrado: Sab Dic 19, 2009 7:33 pm
Mensajes: 36

Nota Publicado: Lun Dic 05, 2011 6:26 am 
Arriba  
@maiku: por supuesto :D

@sandrafersanti, seguro que no has puesto el struct delante del sysinfo. A mi me funciona perfectamente.

Código:
#include <sys/syscall.h>
#include <iostream>
#include <sys/sysinfo.h>

using namespace std;

int main(int argc, char *argv[]) {
    int resul;
    struct sysinfo info;

    resul= syscall(SYS_sysinfo,&info);

    cout << "-------------------------------SYSINFO--------------------------------------" << endl;
    cout << "Codigo de retorno = " << resul << endl;
    cout << "Uptime = " << info.uptime << endl;
    cout << "Carga 1 min  " << info.loads[0] << endl;
    cout << "Carga 5 min = " << info.loads[1] << endl;
    cout << "Carga 15 min = " << info.loads[2] << endl;
    cout << "RAM total = " << info.totalram << endl;
    cout << "libre = "<< info.freeram << endl;
    cout << "compartida = " << info.sharedram << endl;
    cout << "Swap total = " << info.totalswap << endl;
    cout << "swap libre = " << info.freeswap << endl;
    cout << "libre = " << info.bufferram << endl;
    cout << "numero de procesos = " << info.procs << endl;
    cout << "tamaño de memoria alta = " << info.totalhigh << endl;
    cout << "tamaño de memoria alta libre en bytes = "<< info.freehigh <<endl;
    cout << "tamaño memoria = " << info.mem_unit << endl;
    cout << "\n" << endl;
    return 0;
}


Código:
Codigo de retorno = 0
Uptime = 70802
Carga 1 min  43040
Carga 5 min = 34112
Carga 15 min = 25728
RAM total = 3933429760
libre = 257028096
compartida = 0
Swap total = 0
swap libre = 0
libre = 132620288
numero de procesos = 373
tamaño de memoria alta = 0
tamaño de memoria alta libre en bytes = 0
tamaño memoria = 1

_________________
Just feel the code...

 Perfil Email  

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Mar Nov 29, 2011 6:27 am
Mensajes: 4

Nota Publicado: Lun Dic 05, 2011 6:41 am 
Arriba  
si ya me funciona. ¡Un millón de gracias!!

Saludetes

 Perfil Email  
Mostrar mensajes previos:  Ordenar por  
 [ 8 mensajes ] 
Nuevo tema Responder al tema

Saltar a:  


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados

No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group :: Style based on FI Subice by phpBBservice.nl :: Todos los horarios son UTC - 6 horas
Traducción al español por Huan Manwë
phpBB SEO