設備訪問控制:
1,獨佔方式訪問,一次只能有一個進程訪問設備,其他進程打開設備的時候,在open方法中均返回-EBUSY,告訴用戶空間設備忙;
int open(struct inode *i_node , struct file *filp){
if(atomic_dec_unless_positive(&pc) && pid==current->pid){
atomic_inc(&pc);
return -EBUSY;
}
... ...
}
2,單個用戶多個進程訪問設備;
a,非阻塞open
int open(struct inode *i_node , struct file *file){
if(owner!=current->cred->uid.val && atomic_dec_unless_positive(&uid) && !capable(CAP_SYS_ADMIN)){
atomic_inc(&uid);
return -EBUSY;
}
spin_lock(spin);
count++;
spin_unlock(&pin);
... ...
}
b,阻塞open
3,複製虛擬設備;例如:tty虛擬終端,驅動複製設備創建虛擬設備;