在客户端API中,例如lksctp-tools:
int setsockopt (int __fd, int __level, int __optname,
__const void *__optval, socklen_t __optlen);
在Linux内核源代码中(引用" include / linux / net.h"):
int (*setsockopt)(struct socket *sock, int level,
int optname, char __user *optval, unsigned int optlen);
客户端API对第一个参数使用整数类型FD值,但内核接收第一个参数的struct socket
指针。
如何解释这种差异?是否存在另一个图书馆?
答案 0 :(得分:0)
用户API通常会屏蔽用户的内部结构,它们仅提供不透明类型。文件描述符是这样的,你只看到一个整数,但在内部它与一些结构化数据相关联。
内核应该是一致的,所以我们不希望用户能够自己修改这样的结构。因此,只能通过一些特殊调用(系统调用)访问内核。这些调用是特殊的,因为执行跨越用户空间和安全内核空间之间的边界。您无法直接访问内核空间,必须通过预定义的门户。
然后在内部,内核做任何他想做的事情,它有自己的内部API,你不能使用,但他为你提供了一种向他提供服务的方法。
想想你申请身份证时会发生什么:你填写一份表格给一些管理员(你进行系统调用),但你永远不知道幕后真的发生了什么(内核中的内部技巧)。