首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我看到套接字代码时,我正在仔细阅读glibc,有人能解释一下是怎么回事吗?

问当我看到套接字代码时,我正在仔细阅读glibc,有人能解释一下是怎么回事吗?
EN

Stack Overflow用户
提问于 2013-02-15 03:13:12
回答 2查看 1K关注 0票数 9

这是我浏览的源码:glibc source。我的特殊问题源于这组特殊的函数:socket library。

例如(大多数函数都是这样设置的)socket/bind.c的源代码是:

代码语言:javascript
复制
  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>

我承认我没有花很多时间,但是实际函数的代码到底在哪里,发生了什么?这是一个使用得很好的范例吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-15 03:36:40

__bind函数是一个stub:它的外观看起来像真实的东西(相同的原型),但不执行必需的函数。

weak_alias宏告诉链接器bind将成为__bind的弱别名。也就是说,bind的这个定义是一个weak symbol。如果没有名为bind的符号的其他定义,则此定义成立;如果存在bind的另一个(非弱)定义,则非弱定义成立,弱定义将被忽略。弱别名是一种弱符号,它是另一个符号的别名(与其本身具有定义相反)。如果使用该弱别名,则stub_warning宏会使链接器发出警告。

bind的真正实现取决于编译时所针对的操作系统。在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/linux/*/socket.S中重用了依赖于体系结构的socket定义。这些定义都是对底层系统调用的简单包装,小心地将参数和返回值复制到适当的寄存器中。

票数 9
EN

Stack Overflow用户

发布于 2013-02-15 03:19:22

您看到的是一般的bind()实现,它...只是告诉您bind()没有实现(它只是返回一个错误,并将errno设置为ENOSYS - syscall not implemented。)。

glibc中的许多与平台相关的系统调用都是这样工作的--有一个默认的实现只返回一个错误,并且每个平台/架构器都必须提供系统调用的实现。

例如,在/sysdeps/unix/sysv/ linux /i386/socket.s中查找linux x86实现。

当然,socket()只是一个系统调用,所以实际的实现在内核中。Glibc只是提供了一个C包装器来调用它。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14882289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档