Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2353397
  • 博文数量: 141
  • 博客积分: 3552
  • 博客等级: 中校
  • 技术积分: 4148
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-15 14:39
个人简介

熟悉Linux下程序设计及各种应用程序 熟悉C Language 熟悉Glusterfs、FFmpeg、CDN 系统设计,计算机图形系统设计、分布式程序设计 目前主要研究方向:流媒体

文章分类

全部博文(141)

分类: LINUX

2009-09-25 12:00:44

阅读了kernel的start_kernel代码后,学习了一下kernel_thread的使用
 
 
 

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/sched.h>

MODULE_AUTHOR("T-bagwell_CU");
MODULE_LICENSE("GPL");

static DECLARE_WAIT_QUEUE_HEAD(myevent_waitqueue);
extern unsigned int myevent_id;


static int example_kernel_thread(void *unused)
{
        DECLARE_WAITQUEUE(wait, current);

        daemonize("create_by_T-bag");
        allow_signal(SIGKILL);
        add_wait_queue(&myevent_waitqueue, &wait);

        while(1){
                set_current_state(TASK_INTERRUPTIBLE);
                schedule();

                if(signal_pending(current)){
                        break;
                }
        }

        set_current_state(TASK_RUNNING);
        remove_wait_queue(&myevent_waitqueue, &wait);
        printk(KERN_WARNING "This is in example_kernel_thread\n");

        return 0;
}

static __init int init_hello_kernel_thread(void)
{
        int ret;

        ret=kernel_thread(example_kernel_thread, NULL,
                                  CLONE_FS | CLONE_FILES | CLONE_SIGHAND | SIGCHLD );

        if(unlikely(ret<0)){
                printk(KERN_WARNING "kernel_thread create failed \n");
        }
        else{
                printk(KERN_WARNING "kernel_thread create success \n");
        }

        return 0;
}

static __exit void cleanup_hello_kernel_thread(void)
{
        printk(KERN_WARNING "kernel_thread exit \n");
        return ;
}

module_init(init_hello_kernel_thread);
module_exit(cleanup_hello_kernel_thread);


写一个Makefile来编译这个module

KERNELDIR = /usr/src/kernels/2.6.27.5-117.fc10.i686
PWD := $(shell pwd)
obj-m := kernel_thread.o

modules:
            $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
            rm -rf *.o *.ko test_chrdev Module.* module* *.mod.c


编译完成以后,可以看一下结果:

 
从上图可以看出来,kernel_thread.ko文件已经被insmod进了modules里
接下来可以看一下进程:
 
这个内核线程也被创建出来了
阅读(4161) | 评论(0) | 转发(3) |
给主人留下些什么吧!~~