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與之對應。

 

完。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Android中mesure过程详解 –[通俗易懂]

    Android中mesure过程详解 –[通俗易懂]invalidate()最后会发起一个View树遍历的请求,并通过执行performTraersal()来响应该请求,performTraersal()正是对View树进行遍历和绘制的核心函数,内部的

  • c求逆矩阵的代码_二维矩阵求逆

    c求逆矩阵的代码_二维矩阵求逆刷石油大刷自闭了,随便写点乱七八糟的东西放松一下。。逆矩阵=伴随矩阵除以对应行列式的值,所以分别把这两个求出来就解决了,另外为了避免产生分数,就不做进一步计算了。效果图如下。至于代码。。就是把上次写的行列式求值的博客稍微改了一下,emmm。#include<stdio.h>#include<iostream>#pragmawarning(disa…

  • Academic social networks: Modeling, analysis, mining and applications 2019翻译[通俗易懂]

    Academic social networks: Modeling, analysis, mining and applications 2019翻译[通俗易懂]Academicsocialnetworks:Modeling,analysis,miningandapplications摘要:在快速增长的学术大数据背景下,社交网络技术最近引起了学术界和工业界的广泛关注。学术社会网络的概念正是在学术大数据的背景下产生的,指的是由学术实体及其关系形成的复杂的学术网络。有大量的学术大数据处理方法来分析学术社交网络丰富的结构类型和相关信息。现在各种学术数据都很容易获取,这让我们更容易分析和研究学术社交网络。本研究调查了学术社交网络的背景、现状和趋势。我们首先

  • 【谷粒商城】框架扩充篇(3/4)「建议收藏」

    【谷粒商城】框架扩充篇(3/4)「建议收藏」1.ELASTICSEARCH1、安装elasticsearchdokcer中安装elasticsearch(1)下载ealasticsearch和kibanadockerpullelasticsearch:7.6.2dockerpullkibana:7.6.2(2)配置mkdir-p/mydata/elasticsearch/configmkdir-p/mydata/elasticsearch/dataecho”http.host:0.0.0.0″>

  • 程序员需要学数电吗(手机费电快有什么方法)

    目录????0.前言:????1.常见进制介绍:????(1)十进制:①示例:②可知一个任意多位的十进制数D均可展开为如下形式:③拓展——若以N取代式中的10,即可得到多位任意进制(N进制)数展开式的普遍形式:????(2)二进制:①根据N进制数展开的普遍形式可得任意一个二进制数均可展开为:![在这里插入图片描述](https://img-blog.csdnimg.cn/b7a289fac3d54c6f8ef071849945ca92.png)②并可利用上式计算出任一二进制数所表达的十进制数的大小:???

  • Dirsearch_torrentsearch下载

    Dirsearch_torrentsearch下载dirsearch下载下载网址:https://github.com/maurosoria/dirsearch下图是下载好的文件夹这样就下载好了我在使用的时候出现了下面的这个问题百度了很久也没有找到,kali也不太会用,就继续找继续找,终于????,解决办法找到了!!!是用户权限的问题!依然对dirsearch修改用户权限还是在属性->安全里面选择想要添加的用户,并允许该用户完全控制如下图…

发表回复

您的电子邮箱地址不会被公开。

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