- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
ops->getsockopt ( code here )。而 sock->ops 是一个名为 proto_ops -6ren">
在 Linux 内核中,我发现系统调用 getsockopt
最后调用 sock->ops->getsockopt
( code here )。而 sock->ops
是一个名为 proto_ops
的结构体。该结构包含许多函数指针,例如 getsockopt
我想知道它指向哪里——我没有找到启动这个结构的地方。
我正在使用 IPv4 和 TCP 进行系统调用,它可能有一些特定的实现函数可以在这里调用。
任何见解都会非常有帮助。提前致谢!
最佳答案
对于 IPv4 套接字,ops 将是结构之一 inet_stream_ops
, inet_dgram_ops
, inet_sockraw_ops
在 net/ipv4/af_inet.c
中定义(除非您使用的是 SCTP 之类的奇怪东西,它在别处定义了自己的操作)。要查看这些指针如何到达那里,请查看 inet_create
在同一个文件中,即 called from __sock_create
as pf->create()
.
要查看 that 指针如何到达那里,请注意 inet_create
是名为 inet_family_ops
的结构的 create
成员> 这是 passed to sock_register()
,导致它被放置在创建套接字时查询的 net_families
数组中。
当您想了解不同内核组件的连接方式时,名称中带有 register
的函数是个好东西。
现在回到getsockopt
。如果您查看 getsockopt
指针的实际去向,在所有 3 个 inet_*_ops
结构中,它指向 sock_common_getsockopt
的 getsockopt
函数。
net/core/sock.c
中的
sock_common_getsockopt
不是很有趣。它只是从 struct socket
中提取一个 struct sock
,然后调用 sk->sk_prot->getsockopt
。所以接下来您会想知道 that 从何而来。
它来自下一层。我将以 TCP 为例。
在net/ipv4/tcp_ipv4.c
中有一个struct proto tcp_prot
,其中getsockopt
成员指向tcp_getsockopt
,定义在net/ipv4/tcp.c
中的函数。它自己实现 SOL_TCP
选项,对于其他选项,它从另一个名为 icsk_af_ops
的操作结构调用 getsockopt
方法。这让我们回到 net/ipv4/tcp_ipv4.c
,其中 struct inet_connection_sock_af_ops ipv4_specific
有 getsockopt
指向 ip_getsockopt
。
ip_getsockopt
在 net/ipv4/ip_sockglue.c
中,它在同一文件中调用 do_ip_getsockopt
,这是 SOL_IP
选项实际被处理。
关于linux - 函数指针指向 struct "proto_ops"的哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36206744/
在 Linux 内核中,我发现系统调用 getsockopt 最后调用 sock->ops->getsockopt ( code here )。而 sock->ops 是一个名为 proto_ops
正在研究tcp/ip的实现,特别是sockets层,有几个结构不是很明白。 我知道“struct proto_ops”用于定义操作,例如绑定(bind)/连接/接受,每个套接字都有一个指定的 prot
我是一名优秀的程序员,十分优秀!