2011-11-20 7 views
5

¿Es posible ver las definiciones de estructura utilizando páginas man de la misma forma que podemos ver las definiciones de funciones en UNIX?Obtención de definiciones de estructura mediante las páginas man

Por ejemplo, para la programación en red, usamos una estructura llamada struct sockaddr_in. ¿Hay alguna forma de ver cómo se ha definido sockaddr_in en la biblioteca usando páginas man?

¡Cualquier ayuda será apreciada! ¡Gracias!

+1

Si está utilizando vim, puede usar ctags para generar etiquetas del directorio '/ usr/include' y luego saltar a la etiqueta para ver la definición. De lo contrario, parece una buena oportunidad para un proyecto de código abierto. –

Respuesta

2

Depende de la función. Por ejemplo, puede obtener la definición de struct sockaddr mirando man page de bind(2).

Desafortunadamente, no hay una página de manual de usuario para struct sockaddr.

Otras formas de obtener esta información serían buscar los archivos de encabezado apropiados.

+0

Gracias. Ver los archivos de cabecera definitivamente es una opción. Pero, ¿hay alguna manera de determinar la función que contiene la estructura particular? –

+1

Bueno, supongo que una búsqueda en Google sería una buena manera. Otra forma sería [grep] (http://linux.die.net/man/1/grep) para la estructura en su directorio de inclusión. – Anthony

+0

La búsqueda de Google es la mejor opción de todas .. lol .. pero desafortunadamente tengo que trabajar a veces sin una conexión a internet en vivo. –

1

Y no estoy seguro de que realmente le importe: las llamadas al sistema se pueden ver como tratar y proporcionar tipos de datos abstractos. Por ejemplo, incluso si open devuelve un número entero, no tiene sentido incrementar ese número entero. Por tales razones, el módulo Ocaml Unix describe el resultado de open como un tipo abstracto file_descr, no como un int (que es realmente).

En otras palabras, su código C o C++ idealmente no debería cambiar si ha cambiado struct sockaddr_in.

+1

Eso es cierto en cierto sentido, pero ¿qué pasa con funciones como [connect] (http://linux.die.net/man/2/connect) donde necesita conocer la estructura de 'struct sockaddr' y amigos para poder hacer la conexión apropiada. – Anthony

+0

Entonces, un 'grep -rn2 sockaddr/usr/include' es prácticamente suficiente (si todos los paquetes de desarrollo -como' libc6-dev' etc ...- han sido instalados). –

2

man-pages es solo un archivo escrito por humanos o generado por deseo de humanos. Por lo general, todas las estructuras relacionadas se mencionan en páginas man con funciones que usaron. A veces puede encontrar páginas para archivos de encabezado (time.h(0p)). A veces hay páginas para bibliotecas enteras (libsensors(3)). A veces hay páginas reales para estructuras (XAnyEvent(3)).

Es posible que desee comprobar apropos y whatis. A veces pueden encontrar páginas relacionadas con lo que estás buscando.

6

Para cualquier cabecera dada:

echo '#include <netinet/in.h>' | gcc -E - | less 

que genera de interés relevante:

# 225 "/usr/include/netinet/in.h" 3 4 
struct sockaddr_in 
    { 
    sa_family_t sin_family; 
    in_port_t sin_port; 
    struct in_addr sin_addr; 


    unsigned char sin_zero[sizeof (struct sockaddr) - 
     (sizeof (unsigned short int)) - 
     sizeof (in_port_t) - 
     sizeof (struct in_addr)]; 
    }; 

Esto se puede hacer utilizando cualquier compilador con una opción de preprocesador (cada compilador de C que conozco puede hacer esto)

1

Para cualquier cabecera dada:

echo '#include <netinet/in.h>' | gcc -E - | less 

que genera de interés relevante:

# 225 "/usr/include/netinet/in.h" 3 4 
struct sockaddr_in 
    { 
    sa_family_t sin_family; 
    in_port_t sin_port; 
    struct in_addr sin_addr; 


    unsigned char sin_zero[sizeof (struct sockaddr) - 
     (sizeof (unsigned short int)) - 
     sizeof (in_port_t) - 
     sizeof (struct in_addr)]; 
    }; 

Esto se puede hacer utilizando cualquier compilador con una opción de preprocesador (cada compilador de C que conozco puede hacer esto) La página del manual para sockaddr_in es IP(7).

4

Estoy un poco tarde pero la estructura relevante se puede encontrar en la página de manual de ip, tendría que desplazarse un poco hacia abajo.por ejemplo -

> man ip produce

Address format 
     An IP socket address is defined as a combination of an IP interface address and a 16-bit 
     port number. The basic IP protocol does not supply port numbers, they are implemented 
     by higher level protocols like udp(7) and tcp(7). On raw sockets sin_port is set to the 
     IP protocol. 

      struct sockaddr_in { 
       sa_family_t sin_family; /* address family: AF_INET */ 
       in_port_t  sin_port; /* port in network byte order */ 
       struct in_addr sin_addr; /* internet address */ 
      }; 

      /* Internet address. */ 
      struct in_addr { 
       uint32_t  s_addr;  /* address in network byte order */ 
      }; 

sólo la búsqueda de páginas man relacionadas y usted encontrará variedad de información para su referencia.

Cuestiones relacionadas