ops->accept’"-6ren"> ops->accept’"-我正在用套接字编写内核模块。当我尝试为接受连接编写代码时,我得到: “错误:函数‘sock->ops->accept’的参数太少 ret = sock->ops->accept(sock, clien-6ren">
gpt4 book ai didi

c - 为什么我得到 "error: too few arguments to function ‘sock->ops->accept’"

转载 作者:行者123 更新时间:2023-12-01 13:54:41 24 4
gpt4 key购买 nike

我正在用套接字编写内核模块。当我尝试为接受连接编写代码时,我得到:

“错误:函数‘sock->ops->accept’的参数太少 ret = sock->ops->accept(sock, client_sock, 0);"

我查看了 socket accept 的实现,只有三个参数,所以我不知道发生了什么。

struct socket *sock = NULL, *client_sock = NULL;
//some code here, create socket, bind, listen
ret = sock->ops->accept(sock, client_sock, 0);

我希望它应该有效,但它没有。如果在实现中只有三个,为什么会出现“参数太少”错误?我该如何解决?

最佳答案

->accept() 处理程序的原型(prototype)在内核版本 4.10 和 4.11 之间被此提交更改:“net: Work around lockdep limitation in sockets that use sockets”。

正如用户 MofX 中所述的answer->accept() 处理程序在当前内核版本(自 4.11 起)中具有第四个参数 bool kern。根据commit描述,这类似于传递给->create()kern参数,区分是kernel_accept()还是sys_accept4() 是调用者。见 commit description了解详情。

如果您希望您的代码在 4.11 之前和之后都适用于内核,则需要使用条件编译:

#include <linux/version.h>

#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0)
#define KV_ACCEPT_HAS_BOOL_KERN
#endif

#ifdef KV_ACCEPT_HAS_BOOL_KERN
// your code needs to determine whether 'kern' should be false or true here...
ret = sock->ops->accept(sock, client_sock, 0, kern);
#else
ret = sock->ops->accept(sock, client_sock, 0);
#endif

关于c - 为什么我得到 "error: too few arguments to function ‘sock->ops->accept’",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57354274/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com