信号量使用的实例如下:<br />#include <br />#include <br />#include <br />#include <br />MODULE_LICENSE('Dual BSD/GPL'); <br />int num[2][5]={ <br /> {0,2,4,6,8}, <br /> {1,3,5,7,9} <br />}; <br /><br />struct semaphore sem_first; <br />struct semaphore sem_second; <br />int thread_print_first(void *); <br />int thread_print_second(void *); <br />int thread_print_first(void *p) <br />{ <br /> int i; <br /> int *num=(int *)p; <br /> for(i=0;i<5;i++) { <br /> down(&sem_first); <br /> printk(KERN_INFO'Hello World:%d\n',num); <br /> up(&sem_second); <br /> } <br /> return 0; <br />} <br /><br />int thread_print_second(void *p) <br />{ <br /> int i; <br /> int *num=(int *)p; <br /> for(i=0;i<5;i++) { <br /> down(&sem_second); <br /> printk(KERN_INFO'Hello World:%d\n',num); <br /> up(&sem_first); <br /> } <br /> return 0; <br />} <br /><br />static int hello_init(void) <br />{ <br /> printk(KERN_ALERT'Hello World enter\n'); <br /> init_MUTEX(&sem_first); <br /> init_MUTEX(&sem_second); <br /> kernel_thread(thread_print_first,num[0],CLONE_KERNEL); <br /> kernel_thread(thread_print_second,num[1],CLONE_KERNEL); <br /> return 0; <br />} <br /><br />static void hello_exit(void) <br />{ <br /> printk(KERN_ALERT'hello world exit\n'); <br />} <br /><br />module_init(hello_init); <br />module_exit(hello_exit); <br />MODULE_AUTHOR('Niu Tao'); <br />MODULE_DESCRIPTION('A simple hello world Module'); <br />MODULE_ALIAS('a simplest module'); <br /><br />Makefile: <br /><br />obj-m :=hello.o <br />CURRENT_PATH := $(shell pwd) <br />LINUX_KERNEL := $(shell uname -r) <br />LINUX_KERNEL_PATH := /usr/src/linux-headers-$(LINUX_KERNEL) <br /><br />all: <br /> make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules <br />clean: <br /> rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions <br />Module.symvers .Makefile.swp <br /><br />功能:使用信号量实现数据的顺序打印 <br />运行结果: <br />[ 7538.928624] Hello World enter <br />[ 7538.928846] Hello World:0 <br />[ 7538.940529] Hello World:1 <br />[ 7538.940584] Hello World:2 <br />[ 7538.940840] Hello World:3 <br />[ 7538.940844] Hello World:4 <br />[ 7538.941038] Hello World:5 <br />[ 7538.941042] Hello World:6 <br />[ 7538.941218] Hello World:7 <br />[ 7538.941222] Hello World:8 <br />[ 7538.941408] Hello World:9 <br />[ 7562.273176] hello world exit <br /><br /><br />我的简评:这个例子主要使用了sem.h中的struct semaphore结构:<br />struct semaphore {<br /> spinlock_t lock;<br /> unsigned int count;<br /> struct list_head wait_list;<br /> };<br /><br />这与OS课本中的信号量结构几乎一致,除了多一个加锁的字段lock. 其中的down()和up()相当于P、V操作。<br /><br />另外,kernel_thread( )函数创建一个新的内核线程,它接受的参数有:所要执行的内核函数的地址(fn )、要传递给函数的参数(arg)、一组clone标志(flags)。 该函数本质上以下面的方式调用do_fork( ):<br />do_fork(flags|CLONE_VM|CLONE_UNTRACED, 0, pregs, 0, NULL, NULL);<br /><br />问题:如果调整下面两个函数的顺序:<br /> kernel_thread(thread_print_first,num[0],CLONE_KERNEL); <br /> kernel_thread(thread_print_second,num[1],CLONE_KERNEL); <br /> 或者第二个参数,改变一下,执行结果怎样,如果不加down()和UP(),结果如何? |
|