Chinaunix首页 | 论坛 | 博客
  • 博客访问: 952244
  • 博文数量: 113
  • 博客积分: 7235
  • 博客等级: 少将
  • 技术积分: 2101
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-14 11:24
文章分类

全部博文(113)

文章存档

2013年(7)

2012年(5)

2011年(6)

2010年(8)

2009年(15)

2008年(72)

分类: LINUX

2008-09-21 14:49:49


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

#include<linux/semaphore.h> //2.6.28
MODULE_LICENSE("Dual BSD/GPL");
int num[2][5]={
    {0,2,4,6,8},
    {1,3,5,7,9}
};
struct semaphore sem_first;
struct semaphore sem_second;
int thread_print_first(void *);
int thread_print_second(void *);
int thread_print_first(void *p)
{
    int i;
    int *num=(int *)p;
    for(i=0;i<5;i++) {
        down(&sem_first);
        printk(KERN_INFO"Hello World:%d\n",num[i]);
        up(&sem_second);
    }
    return 0;
}
int thread_print_second(void *p)
{
    int i;
    int *num=(int *)p;
    for(i=0;i<5;i++) {
        down(&sem_second);
        printk(KERN_INFO"Hello World:%d\n",num[i]);
        up(&sem_first);
    }
    return 0;
}
static int hello_init(void)
{
    printk(KERN_ALERT"Hello World enter\n");
    init_MUTEX(&sem_first);

    init_MUTEX_LOCKED(&sem_second);
    kernel_thread(thread_print_first,num[0],CLONE_KERNEL);
    kernel_thread(thread_print_second,num[1],CLONE_KERNEL);
    return 0;
}
static void hello_exit(void)
{
    printk(KERN_ALERT"hello world exit\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_AUTHOR("Niu Tao");
MODULE_DESCRIPTION("A simple hello world Module");
MODULE_ALIAS("a simplest module");


Makefile:

obj-m :=hello.o
CURRENT_PATH := $(shell pwd)
LINUX_KERNEL := $(shell uname -r)
LINUX_KERNEL_PATH := /usr/src/linux-headers-$(LINUX_KERNEL)

all:
    make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:
    rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions Module.symvers .Makefile.swp
    

功能:使用信号量实现数据的顺序打印
运行结果:
[ 7538.928624] Hello World enter
[ 7538.928846] Hello World:0
[ 7538.940529] Hello World:1
[ 7538.940584] Hello World:2
[ 7538.940840] Hello World:3
[ 7538.940844] Hello World:4
[ 7538.941038] Hello World:5
[ 7538.941042] Hello World:6
[ 7538.941218] Hello World:7
[ 7538.941222] Hello World:8
[ 7538.941408] Hello World:9
[ 7562.273176] hello world exit

阅读(5450) | 评论(7) | 转发(2) |
0

上一篇:Linux时钟中断(2.6.23)(三)

下一篇:“逛”

给主人留下些什么吧!~~

niutao.linux2009-05-14 22:24:13

这个是2.6.23上写的,如果要在2.6.28上运行,则将 #include 改为 #include 就可以了。

chinaunix网友2009-05-13 20:53:16

适合2.6的内核吗?

niutao.linux2008-09-28 11:35:54

关于这个程序的讨论在这里: http://www.lupaworld.com/bbs/viewthread.php?tid=39389 还有就是上面提到的问题“关于两个kernel_thread次序的问题”,如果我把“init_MUTEX(&sem_second);”改为“init_MUTEX_LOCKED(&sem_second);”则就不存在两个kernel_thread先后次序的问题了。

chinaunix网友2008-09-22 23:18:41

发布在操作系统课程网站http://groups.google.com/group/xiyouoscourse上

niutao.linux2008-09-22 19:56:14

关于内核线程,这里有讲: http://www.sudu.cn/info/html/edu/linux/20070102/290258.html