下面是我在浏览来源: glibc的源 。 我特别的问题是从这一组特定的功能: socket库 。
例如(大部分的功能被设置这种方式) 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
函数是存根 :它看起来像外部的真实的东西(相同的原型),但不进行必要的功能的功能。
该weak_alias
宏告诉链接器bind
是成为一个弱别名__bind
。 也就是说,这个定义bind
是一个弱符号 。 如果有一个被称为符号的任何其他定义bind
,这个定义代表; 如果有另一个(非弱)定义bind
那么非弱定义站和弱定义将被忽略。 弱别名是一个弱符号是另一码元的别名(而不是具有其自己的权利的定义)。 该stub_warning
宏导致链接器,如果使用的是弱别名发出警告。
真正落实bind
依赖于操作系统的Glibc编译为上。 在赫德 ,它被定义sysdeps/mach/hurd/bind.c
。 在Linux中, bind
是系统调用:有在Glibc的源为它没有C代码,只汇编代码。 bind
是在提供sysdeps/unix/sysv/linux/bind.S
其中重用的体系结构相关的定义socket
中sysdeps/unix/sysv/linux/**/socket.S
或ports/sysdeps/unix/sysv/linux/*/socket.S
。 这些定义都是围绕基础系统调用的瘦包装,注意该参数和返回值复制到适当的寄存器。
您现在看到的一般的bind()实现这...只是告诉你,绑定()不implementet(这只是返回一个错误,并设置errno为ENOSYS - 系统调用未实现)。
许多依赖于平台系统glibc的工作需要这样 - 有,只是返回一个错误的默认实现,并且每个平台/ architector有如果存在的话,以提供系统调用的实现。
看在如./sysdeps/unix/sysv/linux/i386/socket.S为Linux x86的实现。
Ofcourse,插座()仅仅是一个系统调用,所以实际实现的内核。 glibc的只是提供了一个C包装调用它。
文章来源: I was perusing glibc when I came across the socket code, can someone explain what is going on?