- 论坛徽章:
- 1
|
请教linux内核中goto语句的问题!
我们看看我写的这个程序片断,这是在内核中的一个遍历双向循环链表的操作,在内核中
我们操作链表一定要加锁,以防止其他进程占用这块内存引起kernel panic。
- ...
- spin_lock(&list_lock);
- list_for_each(p,&user_access_list){
- struct k_user_access *t = list_entry(p,struct k_user_access,a_list);
- if(getpath(file,f))
- {
- printk("Can not get full pathname\n");
- ret= -EPERM;/*我们看看这个程序分支,如果进入if这个分支,我们要返回一个
- 错误-EPERM,如果这里我们直接用return -EPERM;的话,程序就
- 退出了,我看看前面的spin_lock(&list_lock);这个自旋锁是不
- 是还没解开?所以这是很危险的。*/
- goto out;/*我们用goto语句,让程序到out的地方执行,看看我们解锁了然后再return*/
- }
- }
- ret = 0;
- out:
- spin_unlock(&list_lock);
- return ret;
复制代码
你可以看看这个程序任何一个分支都是不会出现上了锁而没解锁就退出程序的现象,这就goto语句的
作用,我们分配内存释放内存的道理也是一样的。如果你还没明白,那我就没办法啦。 |
|