2011-11-20 17 views
5

UNIXの関数定義を見る方法と同様に、マニュアルページを使用して構造体定義を表示できますか?マニュアルページを使用して構造体定義を取得する

たとえば、ネットワークプログラミングでは、struct sockaddr_inという構造を使用します。とにかくsockaddr_inがマニュアルページを使ってライブラリでどのように定義されているか見ていますか?

ご協力いただければ幸いです!ありがとう!

+1

vimを使用している場合は、ctagsを使用して '/ usr/include'ディレクトリのタグを生成し、タグにジャンプして定義を表示できます。さもなければ、オープンソースプロジェクトの良い機会のように見えます! –

答えて

2

機能によって異なります。たとえば、をbind(2)と見て、struct sockaddrという定義を得ることができます。

残念ながら、struct sockaddrのマニュアルページはありません。

この情報を取得する他の方法は、適切なヘッダーファイルを検索することです。

+0

ありがとうございます。ヘッダーファイルを見ることは間違いなくオプションです。しかし、特定の構造を含む関数を決定する方法はありますか? –

+1

さて、私はGoogle検索が良い方法だと思います。別の方法は、[grep](http://linux.die.net/man/1/grep)をインクルードディレクトリの構造体にすることです。 – Anthony

+0

Google検索はすべての選択肢の中で最善の選択です。しかし残念ながら私はライブインターネット接続なしで時々働かなければなりません。 –

1

本当に気にする必要はないと思います。システムコールは、抽象データ型を扱い、提供するものと見なすことができます。たとえば、openが整数を返しても、その整数をインクリメントする意味はありません。このような理由から、Ocaml Unixモジュールでは、openという結果が抽象的なfile_descrタイプであり、int(実際はそうではありません)とは異なります。

つまり、struct sockaddr_inが変更された場合、CコードまたはC++コードは理想的には変更されません。

+1

これはある意味では真ですが、[connect](http://linux.die.net/man/2/connect)のような関数では、 'struct sockaddr'の構造や友達を知る必要があります適切な接続。 – Anthony

+0

それから、 'grep -rn2 sockaddr/usr/include'は実質的に(' libc6-dev'などのようなすべての開発パッケージがインストールされていれば)十分です。 –

2

man-pagesは、人間によって書かれたか、人間の願いによって作られた単なるファイルです。通常、関連するすべての構造体は、それらが使用する関数を持つmanページに記述されています。場合によっては、ヘッダーファイルのページ(time.h(0p))を見つけることができます。時々ライブラリ全体のページがあります(libsensors(3))。時々、構造の実際のページがあります(XAnyEvent(3))。

aproposwhatisにチェックしてください。場合によっては、探しているものに関連するページを見つけることができます。

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

関連する関心の生成:任意のヘッダの

6

これは、プリプロセッサオプションで任意のコンパイラを使用して行うことができる

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

(私の知っているすべてのCコンパイラはこれを行うことができます)。

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

関連する関心の生成:任意のヘッダの

1

これは、プリプロセッサオプションで任意のコンパイラを使用して行うことができる

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

(私の知っているすべてのCコンパイラはこれを行うことができます)。 sockaddr_inのマニュアルページはIP(7)です。

4

少し遅れていますが、関連する構造はマニュアルページipにありますので、少しスクロールしてください。例えば ​​-

> man ip利回り

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

だけで、関連するmanページを検索し、あなたはあなたの参照のための様々な情報を見つけることができます。

関連する問題