如何查找Linux内核sock结构体中setsockopt传入数据的存储位置?
Linux内核中SO_KEEPALIVE选项的存储位置
首先要明确,SO_KEEPALIVE是开关型选项,内核不会直接存储你传入的data变量原始值,而是根据该值的非零/零状态,映射到sock结构体的标志位上:
- 当传入非零值(比如你代码里的
0xfff),内核会给sock结构体的sk_flags字段设置SK_KEEPOPEN标志位; - 传入零值则清除该标志位。
具体细节:
sock结构体定义在include/net/sock.h中,其中的sk_flags成员是一个位掩码,SK_KEEPOPEN就是负责标记是否开启TCP保活的位。- 你找不到直接存储
data的字段,是因为内核只关心该值的布尔状态,不会保存原始整数值,而是将这个状态转换为标志位存储。
内核处理该选项的核心逻辑简化如下:
case SO_KEEPALIVE: if (val) sk->sk_flags |= SK_KEEPOPEN; else sk->sk_flags &= ~SK_KEEPOPEN; break;
内容的提问来源于stack exchange,提问作者Eric Gumba
相关产品推荐
相关产品推荐

