2011-11-20 13 views
5

È possibile visualizzare le definizioni di struttura utilizzando le pagine man come possiamo vedere le definizioni di funzioni in UNIX?Ottenere le definizioni di struttura utilizzando le pagine man

Ad esempio, per la programmazione di rete, viene utilizzata una struttura denominata struct sockaddr_in. Esiste comunque la possibilità di vedere come sockaddr_in è stato definito nella libreria usando le pagine man?

Qualsiasi aiuto sarà apprezzato! Grazie!

+1

Se si utilizza vim, è possibile utilizzare ctags per generare tag della directory '/ usr/include' e quindi passare al tag per visualizzare la definizione. Altrimenti sembra una buona opportunità per un progetto open source! –

risposta

2

Dipende dalla funzione. Ad esempio, è possibile ottenere la definizione di struct sockaddr osservando lo man page di bind(2).

Sfortunatamente, non esiste una pagina man specifica per struct sockaddr.

Altri modi per ottenere questa informazione sarebbe cercare i file di intestazione appropriati.

+0

Grazie. Guardare i file di intestazione è sicuramente un'opzione. Ma esiste un modo per determinare la funzione che contiene la particolare struttura? –

+1

Beh, immagino che una ricerca su Google sarebbe un buon modo. Un altro modo sarebbe quello di [grep] (http://linux.die.net/man/1/grep) per la struttura nella tua directory di inclusione. – Anthony

+0

La ricerca su Google è la migliore opzione di tutti .. lol .. ma sfortunatamente devo lavorare a volte senza una connessione internet live. –

1

E non sono sicuro che si dovrebbe davvero preoccupare: le chiamate di sistema possono essere visualizzate come trattare e fornire tipi di dati astratti. Ad esempio, anche se open restituisce un intero, non ha senso incrementare tale numero intero. Per tali motivi il modulo Ocaml Unix descrive il risultato di open come un tipo astratto file_descr, non come uno int (che in realtà è).

In altre parole, il codice C o C++ dovrebbe idealmente non cambiare se struct sockaddr_in modificato.

+1

Questo è vero in un certo senso, ma per quanto riguarda le funzioni come [connect] (http://linux.die.net/man/2/connect) dove è necessario conoscere la struttura di 'struct sockaddr' e gli amici per fare la connessione appropriata. – Anthony

+0

Quindi un 'grep -rn2 sockaddr/usr/include' è praticamente sufficiente (se tutti i pacchetti di sviluppo, come' libc6-dev' ecc ...- sono stati installati). –

2

man-pages è solo un file scritto da umani o generato dal desiderio umano. Di solito tutte le strutture correlate sono menzionate nelle pagine man con le funzioni con le quali sono usate. A volte è possibile trovare pagine per i file di intestazione (time.h(0p)). A volte ci sono pagine per un'intera libreria (libsensors(3)). A volte ci sono pagine effettive per le strutture (XAnyEvent(3)).

Si consiglia di controllare apropos e whatis. A volte riescono a trovare pagine correlate a ciò che state cercando.

6

Per ogni intestazione:

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

che genera di rilevante interesse:

# 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)]; 
    }; 

Questo può essere fatto utilizzando qualsiasi compilatore con un'opzione di preprocessore (ogni compilatore C che conosco può fare questo).

1

Per ogni intestazione:

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

che genera di rilevante interesse:

# 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)]; 
    }; 

Questo può essere fatto utilizzando qualsiasi compilatore con un'opzione di preprocessore (ogni compilatore C che conosco può fare questo). La pagina man per sockaddr_in è IP(7).

4

Sono un po 'in ritardo ma la struttura pertinente si trova nella pagina man di ip, dovresti scorrere un po' verso il basso.ad esempio -

> man ip cede

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 */ 
      }; 

basta cercare pagine man correlate e troverete numerose informazioni per il vostro riferimento.

Problemi correlati