在客户端 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
的指针作为第一个参数。
如何解释这种差异?是否存在另一个库?
最佳答案
用户 API 通常向用户隐藏内部结构,它们仅提供不透明类型。文件描述符就是这样,您只能看到一个整数,但在内部它与一些结构化数据相关联。
内核应该是一致的,所以我们不希望用户能够自己修改这些结构。因此,内核只能通过一些特殊调用(系统调用)来访问。这些调用很特殊,因为执行跨越了用户空间和安全内核空间之间的边界。您无法直接访问内核空间,必须通过预定义的门户。
然后在内部,内核为所欲为,它有自己的内部 API,你不能使用,但他为你提供了一种向他请求服务的方法。
想想当您请求身份证时会发生什么:您填写一张表格并将其交给某些管理部门(您进行系统调用),但您永远不知道幕后到底发生了什么(内核中的内部技巧)。
关于c - 为什么客户端API和内核的setsockopt第一个参数的类型不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30770178/