【问题标题】:Obtaining structure definitions using man pages使用手册页获取结构定义
【发布时间】:2012-01-02 08:09:02
【问题描述】:

是否可以像在 UNIX 中查看函数定义一样使用手册页查看结构定义?

例如,对于网络编程,我们使用称为 struct sockaddr_in 的结构。无论如何,是否可以使用手册页在库中定义 sockaddr_in ?

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

【问题讨论】:

  • 如果你使用vim,可以使用ctags生成/usr/include目录的标签,然后跳转到标签查看定义。否则它看起来像是一个开源项目的好机会!

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


【解决方案1】:

这取决于功能。比如你可以通过查看bind(2)man page得到struct sockaddr的定义。

很遗憾,没有专门针对 struct sockaddr 的手册页。

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

【讨论】:

  • 谢谢。查看头文件绝对是一种选择。但是有什么方法可以确定包含特定结构的函数吗?
  • 好吧,我想谷歌搜索会是个好方法。另一种方法是 grep 获取包含目录中的结构。
  • 谷歌搜索是最好的选择......哈哈......但不幸的是,我有时不得不在没有实时互联网连接的情况下工作。
  • 有一个看到我的答案,虽然如果不是在你回答的时候,我知道。
【解决方案2】:

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

换句话说,如果struct sockaddr_in 发生更改,您的 C 或 C++ 代码最好不要更改。

【讨论】:

  • 从某种意义上说是对的,但是像connect这样的函数呢,你需要知道struct sockaddr和朋友的结构才能进行适当的连接。
  • 那么grep -rn2 sockaddr /usr/include 就足够了(如果所有的开发包 - 如libc6-dev 等...... - 已安装)。
【解决方案3】:

man-pages 只是人为编写或根据人的意愿生成的文件。通常所有相关的结构都在手册页中提到,并带有它们使用的功能。有时您可以找到头文件的页面 (time.h(0p))。有时会有整个图书馆的页面(libsensors(3))。有时会有结构的实际页面(XAnyEvent(3))。

您可能需要检查aproposwhatis。有时他们能够找到与您要查找的内容相关的页面。

【讨论】:

    【解决方案4】:

    对于任何给定的标题:

    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 编译器都可以做到这一点)。

    【讨论】:

      【解决方案5】:

      对于任何给定的标题:

      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)

      【讨论】:

        【解决方案6】:

        我来晚了,但相关结构可以在ip 的手册页中找到,您需要向下滚动一点。例如 -

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-11-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-28
          • 1970-01-01
          • 2018-10-15
          相关资源
          最近更新 更多