为什么setsockopt的第一个参数的类型在客户端API和内核之间有所不同?

时间:2015-06-11 01:39:46

标签: c linux sockets

在客户端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指针。

如何解释这种差异?是否存在另一个图书馆?

1 个答案:

答案 0 :(得分:0)

用户API通常会屏蔽用户的内部结构,它们仅提供不透明类型。文件描述符是这样的,你只看到一个整数,但在内部它与一些结构化数据相关联。

内核应该是一致的,所以我们不希望用户能够自己修改这样的结构。因此,只能通过一些特殊调用(系统调用)访问内核。这些调用是特殊的,因为执行跨越用户空间和安全内核空间之间的边界。您无法直接访问内核空间,必须通过预定义的门户

然后在内部,内核做任何他想做的事情,它有自己的内部API,你不能使用,但他为你提供了一种向他提供服务的方法。

想想你申请身份证时会发生什么:你填写一份表格给一些管理员(你进行系统调用),但你永远不知道幕后真的发生了什么(内核中的内部技巧)。