小编Mat*_*eus的帖子

如何使用内核哈希表 API?

我正在尝试理解和使用内核哈希表,并且我已经阅读了这个这个链接,但是我一个都不理解。我的第一个问题是:为什么我们的结构必须有struct h_list内部结构?如果我们要通过我们的结构访问我们的结构,struct h_list我们的结构不应该在里面struct h_list而不是相反?阅读教程后,我尝试编写以下代码:

DECLARE_HASHTABLE(nodes_hash, 3)

hash_init(nodes_hash);

struct h_node{
    int data;
    char name[MAX_NAME_SIZE]; /*The key is the name of lua state*/
    struct hlist_node node;
};

struct h_node a = {
    .data = 3,
    .name = "foo",
    .node = 0   
};

struct h_node b = {
    .data = 7,
    .name = "bar",
    .node = 0   
};    

hash_add(nodes_hash,&a.node, "foo");
hash_add(nodes_hash,&b.node, "bar");
Run Code Online (Sandbox Code Playgroud)

但这甚至不能编译。我做错了什么?我需要密钥与struct h_node. 所以我希望我的哈希表是这样的:

在此处输入图片说明

PS:在我的哈希表中它永远不会发生冲突(我会处理它永远不会发生)所以键可以是 struct h_node

c hashtable linux-kernel

5
推荐指数
1
解决办法
3318
查看次数

如何通过netlink发送和接收结构?

我正在尝试使用 netlink 将结构从用户空间发送到内核空间中的模块,我在用户空间中的结构是:

struct test{
  unsigned int length;
  char name[MAX_NAME_LENGTH];
};
Run Code Online (Sandbox Code Playgroud)

在内核空间中是:

struct test{
  __u32 length;
  char name[MAX_NAME_LENGTH];
};
Run Code Online (Sandbox Code Playgroud)

其中MAX_NAME_LENGTH是一个定义为等于 50 的宏。

在用户空间中,我有 main 函数,它使用以下代码将我的结构发送到内核:

int main(){

    struct iovec iov[2];
    int sock_fd;
    struct sockaddr_nl src_add;
    struct sockaddr_nl dest_add;
    struct nlmsghdr * nl_hdr = NULL;
    struct msghdr msg; 

    struct test message;
    memset(&message, 0, sizeof(struct test));
    message.length = 18;
    strcpy(message.name, "Just a test\0");

    sock_fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_USER);

    if (sock_fd < 0){
        printf("Netlink socket creation failed\n");
        return -1;
    }

    memset(&src_add, …
Run Code Online (Sandbox Code Playgroud)

c kernel netlink

0
推荐指数
1
解决办法
749
查看次数

为什么我的结构中的 char 数组即使分配结构也是空的?

我有以下结构:

struct scp_header {
    char state_name[NAME_MAXSIZE];
    enum scp_packet_type type;
    size_t payload_size;
    size_t script_size;
};
Run Code Online (Sandbox Code Playgroud)

我想在几个函数中使用这个结构,但我需要做的第一件事是填充字段state_name,为了做到这一点,我的函数的一部分执行以下操作:

struct scp_header *header;

if ((header = malloc(sizeof(struct scp_header)) == NULL))
    return -1;

if (header->state_name == NULL)
    printf("This field is NULL\n");
header->type = INIT;
header->payload_size = 0;
header->script_size = total_code_size;
Run Code Online (Sandbox Code Playgroud)

我做了上面的验证,因为当我尝试使用时,strncpy(header->state_name, "sometext", NAME_MAXSIZE)我遇到了分段错误。所以我决定检查该state_name字段是否不是 NULL 并且我真的进入了 if 语句,该语句表明该字段是NULL.

我的问题是:为什么这个字段是NULL如果我分配了整个结构,它应该malloc为那个字段分配必要的内存,不是吗?

c malloc struct pointers

0
推荐指数
1
解决办法
67
查看次数

标签 统计

c ×3

hashtable ×1

kernel ×1

linux-kernel ×1

malloc ×1

netlink ×1

pointers ×1

struct ×1