是否可以按照我们在UNIX中查看函数定义的方式查看结构定义?
例如,对于网络编程,我们使用名为struct sockaddr_in
的结构。反正有没有看到如何使用手册页在库中定义sockaddr_in?
任何帮助将不胜感激!谢谢!
答案 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)
您可以查看apropos
和whatis
。有时他们能够找到与您正在寻找的相关的页面。
答案 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 */
};
只需搜索相关的手册页,您就会找到各种信息供您参考。