我正在尝试理解和使用内核哈希表,并且我已经阅读了这个和这个链接,但是我一个都不理解。我的第一个问题是:为什么我们的结构必须有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
我正在尝试使用 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) 我有以下结构:
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为那个字段分配必要的内存,不是吗?