我细读glibc的,当我遇到的套接字代码来了,可有人解释这是怎么回事?(I was perusing

2019-08-16 23:20发布

下面是我在浏览来源: 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>

我承认我没有花很多的时间,但究竟哪里是代码的实际功能和到底是怎么回事? 这是一个很好用的范例?

Answer 1:

__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其中重用的体系结构相关的定义socketsysdeps/unix/sysv/linux/**/socket.Sports/sysdeps/unix/sysv/linux/*/socket.S 。 这些定义都是围绕基础系统调用的瘦包装,注意该参数和返回值复制到适当的寄存器。



Answer 2:

您现在看到的一般的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?
标签: c glibc