使用手册页获取结构定义

时间:2011-11-20 12:20:56

标签: c++ c linux unix network-programming

是否可以按照我们在UNIX中查看函数定义的方式查看结构定义?

例如,对于网络编程,我们使用名为struct sockaddr_in的结构。反正有没有看到如何使用手册页在库中定义sockaddr_in?

任何帮助将不胜感激!谢谢!

6 个答案:

答案 0 :(得分:6)

对于任何给定的标题:

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

产生相关兴趣:

# 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编译器都可以这样做)。

答案 1 :(得分:2)

这取决于功能。例如,您可以通过查看struct sockaddr的{​​{3}}来获取bind(2)的定义。

不幸的是,没有专门针对struct sockaddr的手册页。

获取此信息的其他方法是搜索相应的头文件。

答案 2 :(得分:2)

man页面只是人类编写的文件或人类的愿望所生成的文件。通常所有相关结构都在man-pages中提及,它们与它们一起使用。有时您可以找到标题文件(time.h(0p))的页面。有时会有整个库的页面(libsensors(3))。有时结构的实际页面(XAnyEvent(3))。

您可以查看aproposwhatis。有时他们能够找到与您正在寻找的相关的页面。

答案 3 :(得分:1)

我不确定你真的应该关心:系统调用可以被视为处理和提供抽象数据类型。例如,即使open返回一个整数,也没有意义增加该整数。出于这些原因,Ocaml Unix模块将open的结果描述为抽象的file_descr类型,而不是int(实际上是它)。

换句话说,如果struct sockaddr_in发生更改,理想情况下您的C或C ++代码不应更改。

答案 4 :(得分:1)

对于任何给定的标题:

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

产生相关兴趣:

# 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)

答案 5 :(得分:0)

我有点迟了但相关结构可以在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 */
           };

只需搜索相关的手册页,您就会找到各种信息供您参考。