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_fops
30 };
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: 3
dup: 4
[ 4629.809860] misc_demo_open enter, nodp: c3b88a18, filp: c3859c40.
open: 5
dup: 6
[ 4630.814891] misc_demo_open enter, nodp: c3b88a18, filp: c3859ec0.
open: 7
dup: 8


Begin close.
close: 3
close: 5
close: 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纔會被執行。

此外,如果將同時執行多個test程序,會發現,inode的地址都相同,說明每個文件只有一個inode與之對應。

 

完。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108826.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 大疆网上测评题库_大疆科技题目

    大疆网上测评题库_大疆科技题目Const:1、定义常量(1)const修饰变量,以下两种定义形式在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的。TYPEconstValueName=value;constTYPEValueName=value;(2)将const改为外部连接,作用于扩大至全局,编译时会分配内存,并且可以不进行初始化,仅仅作为声明,编译器认为在程序其他地方进…

    2022年6月16日
    58
  • at24c02模块怎么用_AI8C模块参数

    at24c02模块怎么用_AI8C模块参数AT24C02模块概述:  该文主要描述了,AT24C02简介、AT24C02特性、硬件原理图、管脚描述、从器件地址、写周期限制、读写操作时序。1、AT24C02简介  AT24C01/02/04/08/16是一个1K/2K/4K/8K/16K位(AT24C02大小为256字节)串行CMOSE2PROM内部含有128/256/512/1024/2048个8位字节,CATALYST公…

    2025年6月30日
    5
  • 短短数月 两代“矿工”遭遇冰与火的洗礼「建议收藏」

    短短数月 两代“矿工”遭遇冰与火的洗礼「建议收藏」“比特币又跳水了。”  “那还有回暖的机会吗?”  最近这段时间,相信因为数字货币价格集体跳水而感到恐慌的,不止是炒币的投机客,还有大量“矿工”。  在过去一年多时间里,区块链逐渐变为人人热议的亲民话题,“挖矿”也成为很多人热议的火爆职业。甚至有金融界、互联网公司金领不惜放弃高薪,转型成为比特币“矿工”。  在过去的大半年时间里,比特币等数字货币也经历过几次不同程度的震荡。在遭遇价格上的大起大落之…

    2022年5月6日
    34
  • kali虚拟机安装教程(超详细)

    kali虚拟机安装教程(超详细)一、官方下载KaliLinux官方网址:www.Kali.org下载方式分两种:http下载和bt下载(由于是国外网站http方式下载会非常慢),选择对应版本点击即可下载。二、创建新的虚拟1、新建虚拟机(使用自定义方式),点击”下一步“,然后选择自己所安装的虚拟机版本,再点击”下一步“;2、选择”稍后安装操作系统“,点击”下一步“,选择虚拟机可支持的Linux版本,这里使用Debian8.x,然后点击”下一步“;3、输入虚拟机名称并选择安装位置,点击”.

    2022年5月2日
    71
  • license无效怎么解决_vericut怎么重启许可证

    license无效怎么解决_vericut怎么重启许可证Confluent 修改开源许可证,限制云供应商滥用

    2022年4月21日
    161
  • java正则表达式语法例子_javascript正则表达式

    java正则表达式语法例子_javascript正则表达式匹配验证-验证Email是否正确publicstaticvoidmain(String[]args){//要验证的字符串Stringstr=”service@xsoftlab.net”;//邮箱验证规则StringregEx=”[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}\\.){1,3}[a-zA-z\\-]{1,}”;//编译正则表达式Patternpattern=P

    2022年9月29日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号