【问题标题】:Location of socket() function implementation in linuxlinux中socket()函数实现的位置
【发布时间】: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 sockets


    【解决方案1】:

    其实, 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);
    

    【讨论】:

      【解决方案2】:

      socket(2)ssytem callGlibc 中的socket 函数只是进行真正系统调用的一个小包装器。

      从应用程序的角度来看,系统调用是原子的;换句话说,运行 Linux 应用程序的虚拟机是 x86 机器(非特权指令集),它增加了内核提供的 300 多个系统调用。另请参阅Assembly Howto,它解释了如何编码系统调用。阅读有关 linux kernelsyscalls(2)intro(2) 手册页的更多信息。

      关于套接字的真正工作是在内核内部完成的,它是网络子系统。

      【讨论】:

        【解决方案3】:

        在这里 => socket.c.

        通常大多数套接字函数,包括这个函数,都只是系统调用(直接调用内核)的包装,因此它都是由万能的内核自己处理的。

        这是内核的实现:SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol){...}

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-21
        • 2018-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-23
        相关资源
        最近更新 更多