c - 当我遇到套接字代码时,我正在仔细阅读 glibc,有人可以解释发生了什么吗?

标签 c glibc

这是我正在浏览的来源: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 代码,只有汇编代码。 bindsysdeps/unix/sysv/linux/bind.S 中提供它重用了 sysdeps/unix/sysv/linux/**/socket.Sports/sysdeps/unix/sysv/中 socket 的架构相关定义linux/*/socket.S.这些定义都是底层系统调用的薄包装,注意将参数和返回值复制到适当的寄存器中。

关于c - 当我遇到套接字代码时,我正在仔细阅读 glibc,有人可以解释发生了什么吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14882289/

相关文章:

c++ - 回溯查询非常慢

c++ - 在 C 和 C++ 中通过编译器环境变量或命令行标志指定库路径?

c - 中断问题 pic18f4550

c - SO_KEEPALIVE 在调用 write() 期间不起作用?

我们可以将参数传递给 C 中的信号吗?

Linux Centos 升级glibc 2.12 to 2.14 配置报错

c - C 中的高阶函数

c - glibc - 获取具有包含指定地址的符号的共享库句柄

c++ - 了解 "corrupted size vs. prev_size"glibc 错误

c++ - 为什么 syslog 有两个不同的函数声明?