#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/string.h>
#include <linux/spinlock.h>
#include <linux/list.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("wzt");
typedef struct list_test_struct {
int count;
struct list_head list;
}node;
struct list_head head_list;
rwlock_t list_lock = RW_LOCK_UNLOCKED;
void creat_list(void)
{
node *s = NULL;
int i = 0;
for (i = 0; i < 10; i++) {
s = (node *)kmalloc(sizeof(node), GFP_ATOMIC);
if (!s)
return ;
s->count = i;
write_lock(&list_lock);
list_add_tail(&(s->list), &head_list);
write_unlock(&list_lock);
}
}
void del_data(void)
{
node *s;
struct list_head *p;
write_lock(&list_lock);
list_for_each(p, &head_list) {
s = list_entry(p, node, list);
if (s->count == 5) {
list_del(p);
write_unlock(&list_lock);
return ;
}
}
write_unlock(&list_lock);
}
void print_list(void)
{
node *s;
struct list_head *p;
read_lock(&list_lock);
list_for_each(p, &head_list) {
s = list_entry(p, node, list);
printk("%d,", s->count);
}
write_lock(&list_lock);
}
int list_test_init(void)
{
INIT_LIST_HEAD(&head_list);
creat_list();
print_list();
del_data();
print_list();
return 0;
}
void list_test_exit(void)
{
}
module_init(list_test_init);
module_exit(list_test_exit);
linux内核链表的使用例子