【发布时间】:2016-04-02 19:59:23
【问题描述】:
在glibc 2.22中,在/socket目录下,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)
(删除许可证后的评论。)
send weak_alias 宏作为参数在哪里?这些宏是在哪里定义的?
我认为这是由于与一些蹩脚的旧编译器的兼容性,但为什么他们仍然使用 K&R 语法?
最重要的是,为什么__send会这样定义?
【问题讨论】:
-
不回答你的问题,但
send是一个系统调用,所以你不会在 glibc 中看到太多,除了围绕该调用的一个薄包装器。真正做事的代码将在内核中。另请参阅this question 接受的答案,了解为什么使用这两个名称,以及this document 了解存根函数的一些解释。 -
sourceware.org/glibc/wiki/SyscallWrappers 这是第一种。您需要寻找内核附带的特定于系统的实现。