glibc的套接字实现在哪里?

卡达尼鲁克

在glibc 2.22的/socket目录中,找到套接字库的实现。
但是,当打开这些文件中的任何一个时,我看到的只是一个错误设置功能,下面带有一些宏。
这是一个示例文件(/socket/send.c):

#include <errno.h>
#include <sys/socket.h>

/* Send N bytes of BUF to socket FD.  Returns the number sent or -1.  */
ssize_t
__send (fd, buf, n, flags)
     int fd;
     const __ptr_t buf;
     size_t n;
     int flags;
{
  __set_errno (ENOSYS);
  return -1;
}
libc_hidden_def (__send)
weak_alias (__send, send)

stub_warning (send)

(已删除许可证的注释。)

sendweak_alias在哪里作为参数?这些宏在哪里定义?
我认为这是由于与某些糟糕的旧编译器兼容而引起的,但是为什么他们仍然使用K&R语法?
最重要的是,为什么要这样 __send 定义?

乌鸦

这里发生了几件事。

首先,如该答案所述,glibc本身无法定义标准C不保留的随机标识符,因为标准C允许程序自己定义这些标识符。以双下划线开头的名称为实现保留,因此此处的实现定义了function __send()然后,弱别名允许使用该名称send()来引用它,但也允许该引用被其他地方的强定义覆盖。

其次,如glibc文档中所述,为便于移植,glibc需要任何特定于计算机的功能都具有相应的通用功能。如果可以编写相应的泛型函数,则应该是,但是不能,则泛型函数应该是“存根函数”,它实际上只是设置errnoENOSYS(未实现)并返回错误。如果提供了特定于计算机的功能,则将使用该功能代替存根功能。由于send()需要系统调用,因此显然不能以与计算机无关的方式编写它,因此这里有一个存根函数。所以,你应该能够找到的机器具体实现(或多种它们的)__send(),例如,在/sysdeps/unix/sysv/linux/x86_64/send.c在glibc的源代码树。

顺便说一句,由于send()确实是系统调用,因此您在glibc中通常会看到的是简短的汇编语言例程,可以进行系统调用。实际完成工作的代码将驻留在内核中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

<type_traits>头文件中的某些实现在哪里?

来自分类Dev

Python套接字实现

来自分类Dev

JDBC中使用的Java中的“连接接口”的“ prepareStatement”的实现在哪里?

来自分类Dev

Stream <T>接口中的filter()方法的实现在哪里?

来自分类Dev

Scala微风中转置(DenseMatrix或DenseVector)的低级实现在哪里?

来自分类Dev

cryptsetup中的dm_task_create的实现在哪里?

来自分类Dev

Go中func append的实现在哪里?

来自分类Dev

ASP.NET 5源代码中AuthenticationManager的具体实现在哪里?

来自分类Dev

<pe:exporter>展示柜中的#{exporterController.customExporter}的实现在哪里

来自分类Dev

头文件如何知道函数原型的实现在哪里?

来自分类Dev

javakey现在在哪里?

来自分类Dev

C ++-std :: list标头中_List_node_base成员函数的实现在哪里

来自分类Dev

.net核心中Int32的真正实现在哪里?

来自分类Dev

当路径名太长时,glibc的syscall实现在哪里打开集ENAMETOOLONG errno?

来自分类Dev

int.dart类中isEven的实现在哪里?

来自分类Dev

<type_traits>头文件中的某些实现在哪里?

来自分类Dev

Jenkinsfile管道方法的api文档/实现在哪里?

来自分类Dev

现在,Microsoft Word中的矢量艺术字在哪里?

来自分类Dev

Linux上的运行时UNIX套接字应该放在哪里?

来自分类Dev

JDBC中使用的Java中的“连接接口”的“ prepareStatement”的实现在哪里?

来自分类Dev

在哪里放置套接字,以便PrivateTmp可以为真

来自分类Dev

在哪里可以找到套接字文件?(我想取消链接并删除它。)

来自分类Dev

cryptsetup中的dm_task_create的实现在哪里?

来自分类Dev

javakey现在在哪里?

来自分类Dev

包含的C ++ / C头文件的实现在哪里?

来自分类Dev

ConcurrentQueue TryDequeue实现在哪里

来自分类Dev

TensorFlow:RMSprop 的实际实现在哪里?

来自分类Dev

这些接口方法的实现在哪里?

来自分类Dev

TCP 套接字实现在 Xamarin.Android 中的工作方式是否不同?

Related 相关文章

  1. 1

    <type_traits>头文件中的某些实现在哪里?

  2. 2

    Python套接字实现

  3. 3

    JDBC中使用的Java中的“连接接口”的“ prepareStatement”的实现在哪里?

  4. 4

    Stream <T>接口中的filter()方法的实现在哪里?

  5. 5

    Scala微风中转置(DenseMatrix或DenseVector)的低级实现在哪里?

  6. 6

    cryptsetup中的dm_task_create的实现在哪里?

  7. 7

    Go中func append的实现在哪里?

  8. 8

    ASP.NET 5源代码中AuthenticationManager的具体实现在哪里?

  9. 9

    <pe:exporter>展示柜中的#{exporterController.customExporter}的实现在哪里

  10. 10

    头文件如何知道函数原型的实现在哪里?

  11. 11

    javakey现在在哪里?

  12. 12

    C ++-std :: list标头中_List_node_base成员函数的实现在哪里

  13. 13

    .net核心中Int32的真正实现在哪里?

  14. 14

    当路径名太长时,glibc的syscall实现在哪里打开集ENAMETOOLONG errno?

  15. 15

    int.dart类中isEven的实现在哪里?

  16. 16

    <type_traits>头文件中的某些实现在哪里?

  17. 17

    Jenkinsfile管道方法的api文档/实现在哪里?

  18. 18

    现在,Microsoft Word中的矢量艺术字在哪里?

  19. 19

    Linux上的运行时UNIX套接字应该放在哪里?

  20. 20

    JDBC中使用的Java中的“连接接口”的“ prepareStatement”的实现在哪里?

  21. 21

    在哪里放置套接字,以便PrivateTmp可以为真

  22. 22

    在哪里可以找到套接字文件?(我想取消链接并删除它。)

  23. 23

    cryptsetup中的dm_task_create的实现在哪里?

  24. 24

    javakey现在在哪里?

  25. 25

    包含的C ++ / C头文件的实现在哪里?

  26. 26

    ConcurrentQueue TryDequeue实现在哪里

  27. 27

    TensorFlow:RMSprop 的实际实现在哪里?

  28. 28

    这些接口方法的实现在哪里?

  29. 29

    TCP 套接字实现在 Xamarin.Android 中的工作方式是否不同?

热门标签

归档