在 Linux 中,要创建套接字,我们包含 sys/socket.h 头文件并使用 socket() 函数。头文件位于 /usr/include/sys/socket.h。
extern int socket (int __domain, int __type, int __protocol) __THROW;
谁能告诉 socket() 函数实际实现的位置。
谢谢。
实际上,
int socket (int __domain, int __type, int __protocol) __THROW
在 glibc 中实现,
glibc 调用内核文件net/socket.c中实现的内核函数 sys_socket 。
asmlinkage long sys_socket(int family, int type, int protocol);
socket(2)是一个系统调用。Glibc中的socket
函数只是进行真正系统调用的一个小包装器。
从应用程序的角度来看,系统调用是原子的;换句话说,运行 Linux 应用程序的虚拟机是x86机器(非特权指令集),内核提供了 300 多个系统调用。另请参阅Assembly Howto,它解释了如何对系统调用进行编码。阅读有关linux 内核以及syscalls(2)和intro(2)手册页的更多信息。
关于套接字的真正工作是在内核内部完成的,它是网络子系统。
这是 => socket.c。
通常大多数套接字函数,包括这个函数,只是系统调用(直接调用内核)的包装器,因此它都是由全能的内核自己处理的。
这是内核的实现:SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol){...}