这是我正在浏览的来源:glibc source .我的特定问题来自这组特定的函数:socket library .
例如(大部分功能都是这样设置的)socket/bind.c
的源码是:
19 #include <errno.h>
20 #include <sys/socket.h>
21
22 /* Give the socket FD the local address ADDR (which is LEN bytes long). */
23 int
24 __bind (fd, addr, len)
25 int fd;
26 __CONST_SOCKADDR_ARG addr;
27 socklen_t len;
28 {
29 __set_errno (ENOSYS);
30 return -1;
31 }
32
33 weak_alias (__bind, bind)
34
35 stub_warning (bind)
36 #include <stub-tag.h>
我承认我没有花很多时间,但实际功能的代码到底在哪里,发生了什么?这是一个使用良好的范例吗?
最佳答案
__bind
函数是一个 stub : 它是一个在外部看起来像真实事物(相同原型(prototype))但不执行必要功能的功能。
weak_alias
宏告诉链接器 bind
是 __bind
的弱别名。也就是说,这个 bind
的定义是一个 weak symbol .如果没有其他名为 bind
的符号定义,则该定义有效;如果 bind
有另一个(非弱)定义,则该非弱定义成立,弱定义将被忽略。弱别名是一个弱符号,它是另一个符号的别名(而不是有自己的定义)。 stub_warning
如果使用该弱别名,宏会导致链接器发出警告。
bind
的实际实现取决于编译 Glibc 的操作系统。在 Hurd , 它在 sysdeps/mach/hurd/bind.c
中定义.在 Linux 上,bind
是一个系统调用:在 Glibc 源代码中没有它的 C 代码,只有汇编代码。 bind
在 sysdeps/unix/sysv/linux/bind.S
中提供它重用了 sysdeps/unix/sysv/linux/**/socket.S
或 ports/sysdeps/unix/sysv/中
.这些定义都是底层系统调用的薄包装,注意将参数和返回值复制到适当的寄存器中。socket
的架构相关定义linux/*/socket.S
关于c - 当我遇到套接字代码时,我正在仔细阅读 glibc,有人可以解释发生了什么吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14882289/