而complete实现如下:
void complete(struct completion *x) spin_lock_irqsave(&x->wait.lock, flags); |
不看内核实现的源代码我们也能想到他的实现,不外乎在wait函数中循环等待done变为可用(正),而另一边的complete函数为唤醒函数,当然是将done加一,唤醒待处理的函数。是的,从上面的代码看到,和我们想的一样。内核也是这样做的。
运用
运用LDD3中的例子:
#include <linux/module.h> #include <linux/sched.h> MODULE_LICENSE("GPL"); static int complete_major=250; ssize_t complete_read(struct file *filp,char __user *buf,size_t count,loff_t *pos) ssize_t complete_write(struct file *filp,const char __user *buf,size_t count,loff_t *pos) struct file_operations complete_fops={ int complete_init(void) |
测试步骤:
1、mknod /dev/complete创建complete节点,在linux上驱动程序需要手动创建文件节点。
2、insmod complete.ko 插入驱动模块,这里要注意的是,因为我们的代码中是手动分配的设备号,很可能被系统已经使用了,所以如果出现这种情况,查看/proc/devices文件。找一个没有被使用的设备号。
3、cat /dev/complete 用于读该设备,调用设备的读函数
4、打开另一个终端输入 echo “hello” > /dev/complete 该命令用于写入该设备。