首页 > 代码库 > Linux基礎知識 —— open&close
Linux基礎知識 —— open&close
下面說一下在用戶空間調用open/close/dup跟驅動中的open和release的對應。
下面是測試驅動:
1 #include <linux/module.h> 2 #include <linux/miscdevice.h> 3 #include <linux/fs.h> 4 5 6 static int misc_demo_open(struct inode *nodp, struct file *filp) 7 { 8 printk("%s enter, nodp: %p, filp: %p.\n", __func__, nodp, filp); 9 10 return 0;11 }12 13 static int misc_demo_release(struct inode *nodp, struct file *filp)14 {15 printk("%s enter, nodp: %p, filp: %p.\n", __func__, nodp, filp);16 17 return 0;18 }19 20 static struct file_operations misc_demo_fops = {21 .owner = THIS_MODULE,22 .open = misc_demo_open,23 .release = misc_demo_release,24 };25 26 static struct miscdevice misc_demo_dev = {27 .minor = MISC_DYNAMIC_MINOR,28 .name = "misc_demo",29 .fops = &misc_demo_fops30 };31 32 static __init int misc_demo_init(void)33 {34 int ret; 35 36 ret = misc_register(&misc_demo_dev);37 38 return ret;39 }40 41 static __exit void misc_demo_exit(void)42 {43 misc_deregister(&misc_demo_dev);44 45 return;46 }47 48 module_init(misc_demo_init);49 module_exit(misc_demo_exit);50 MODULE_LICENSE("GPL");
下面是用戶空間測試代碼:
1 #include <stdio.h> 2 #include <sys/types.h> 3 #include <sys/stat.h> 4 #include <fcntl.h> 5 #include <unistd.h> 6 7 8 int main(int argc, const char *argv[]) 9 {10 int fd[3], fd2[3], i;11 12 printf("Begin open.\n");13 for (i=0; i<3; i++) {14 fd[i] = open("/dev/misc_demo", O_RDONLY);15 printf("open: %d\n", fd[i]);16 fd2[i] = dup(fd[i]);17 printf("dup: %d\n", fd2[i]);18 sleep(1);19 }20 21 sleep(5);22 23 printf("Begin close.\n");24 for (i=0; i<3; i++) {25 printf("close: %d\n", fd[i]);26 close(fd[i]);27 sleep(1);28 }29 30 sleep(2);31 32 printf("Begin close dup.\n");33 for (i=0; i<3; i++) {34 printf("close dup: %d\n", fd2[i]);35 close(fd2[i]);36 sleep(1);37 }38 39 return 0;40 }
下面是輸出的log:
Begin open.[ 4628.805135] misc_demo_open enter, nodp: c3b88a18, filp: c3859060.open: 3dup: 4[ 4629.809860] misc_demo_open enter, nodp: c3b88a18, filp: c3859c40.open: 5dup: 6[ 4630.814891] misc_demo_open enter, nodp: c3b88a18, filp: c3859ec0.open: 7dup: 8Begin close.close: 3close: 5close: 7
Begin close dup.close dup: 4[ 4641.845172] misc_demo_release enter, nodp: c3b88a18, filp: c3859060.close dup: 6[ 4642.850183] misc_demo_release enter, nodp: c3b88a18, filp: c3859c40.close dup: 8[ 4643.855123] misc_demo_release enter, nodp: c3b88a18, filp: c3859ec0.
通過分析log,我們得出結論, 用戶空間每調用一次open,驅動中的open都會被執行一次,而在調用dup的時候,只是將struct file的引用計數加1,而沒有產生新的struct file,所以返回的新的fd跟老的fd對應的是同一個struct file,同時也沒用調用open。在close的時候,只有struct file對應的所有fd都被關閉或者說struct file的引用計數爲0的時候,驅動中的release纔會被執行。
完。
Linux基礎知識 —— open&close
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。