【发布时间】:2012-04-06 16:51:15
【问题描述】:
在 Linux 中,要创建套接字,我们包含 sys/socket.h 头文件并使用 socket() 函数。头文件位于 /usr/include/sys/socket.h。
extern int socket (int __domain, int __type, int __protocol) __THROW;
谁能告诉socket()函数实际实现的位置。
谢谢。
【问题讨论】:
在 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) 是ssytem call。 Glibc 中的socket 函数只是进行真正系统调用的一个小包装器。
从应用程序的角度来看,系统调用是原子的;换句话说,运行 Linux 应用程序的虚拟机是 x86 机器(非特权指令集),它增加了内核提供的 300 多个系统调用。另请参阅Assembly Howto,它解释了如何编码系统调用。阅读有关 linux kernel 和 syscalls(2) 和 intro(2) 手册页的更多信息。
关于套接字的真正工作是在内核内部完成的,它是网络子系统。
【讨论】:
在这里 => socket.c.
通常大多数套接字函数,包括这个函数,都只是系统调用(直接调用内核)的包装,因此它都是由万能的内核自己处理的。
这是内核的实现:SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol){...}
【讨论】:
socket.c 是不是正确的。这个是(32位版本):sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/…