c - 为什么客户端API和内核的setsockopt第一个参数的类型不同?

标签 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 的指针作为第一个参数。

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

最佳答案

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

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

然后在内部,内核为所欲为,它有自己的内部 API,你不能使用,但他为你提供了一种向他请求服务的方法。

想想当您请求身份证时会发生什么:您填写一张表格并将其交给某些管理部门(您进行系统调用),但您永远不知道幕后到底发生了什么(内核中的内部技巧)。

关于c - 为什么客户端API和内核的setsockopt第一个参数的类型不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30770178/

相关文章:

c++ - C/C++ 程序使用了多少内存

php - 如何在 Linux 中从 PHP 运行 espeak

php - Htaccess 使用 FastCGI 重写

python - 套接字编程问题 - python

java - 套接字编程 - 服务器是否排队请求?

c - 关于使用 C 程序将 csv 文件转换为特定格式

c - 从 C 中的大结构中获取子结构

c - 如何编写执行 malloc、格式化字符串然后返回格式化字符串的宏?

linux - 如何检查 OpenSSL 中的 FIPS 140-2 支持?

sockets - 在套接字上设置读取超时