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纔會被執行。

完。

时间: 2024-11-04 16:08:52

Linux基礎知識 —— open&close的相关文章

文明5新手的基礎知識

文明玩到現在也累積了一些經驗.由於功力不夠,只能提供一些基礎中的基礎,盼能拋磚引玉,還請高手們不吝指正. 一.        坐城: 移民坐城的規則,應該已經是常識了.當一座城建立時,就會產生4紅臉(3城市紅臉和1人口紅臉).而城本身基礎產出是2糧1鎚.當坐地的地形+資源超過這個基礎值就維持,不夠就補滿. 舉例來說,丘陵的基本產出是2鎚.因此在丘陵上坐城,因為沒糧所以會補上2糧.而2鎚的部分會保留,所以城市產出就是2糧2鎚.這也就是許多人喜歡開在丘陵的緣故(另外還有防禦力的加乘). 如果坐在丘陵

JavaScript基礎知識

1.標籤組使用 <script charset='utf-8' //設置字元集 defet //使腳本延遲到文檔解析完成,Browser已忽略 language='javascript' //設置語言,已廢棄 src='url' //引用外部檔,可選 type='text/javascript' //必選,language替代品 >代碼</script> 列印JavaScript結尾符(外部引用可直接打):'<scr'+'ipt>'); src引用JS後,不要在<

jQuery基礎知識

$(function(){}) //jQuery先執行一遍再執行其他函數 $(document).ready(fn) //文檔加載完後觸發 1. 刪除$:jQuery.noConflict() 2. $('#m') $('a') $('.n') $('*') $('ul li *') $('div#b ul.c') $('span,em,.box') $('div>p') $('div+p') $('div ~p') 3. $('#w').find('p').css() // #m下的p 同$(

BootStrap基礎知識

1. .lead //突出 .text-left //文字居左 .text-right //文字居右 .text-center //文字居中 .text-justify //文字兩端對齊 .text-nowrap //文字不換行 .text-uppercase //大寫 .text-lowercase //小寫 .text-capitalize //首字母大寫 .text-muted //柔和灰 .text-primary //主要藍 .text-success //成功藍 .text-info

Python开发 基礎知識 (未完代補)

Python屬高階語言,所編築的是字節碼 變量:只能由字母.數字.下划線構成,但不能以數字開頭,亦不能與功能關鍵字相同 (ex: and, or, as, assert, break, class, continue, def, del, elif, else, if ,expect, exec, finally, for ,in, while, from, global, import, input, print, is, not ,pass, return, try, with, yeild

Python开发 基礎知識 3.類別&amp;方法 (bool &amp; str) (未完待續)

類別 可使用type()查看 內建 [ 布爾:bool (Boolen) 字串:str (String) 數字:int (Integer) 小數:float 列表:list 元祖:tuple 字典:dict ] 亦可用class宣告新類別 布爾值  (用於比較.邏輯.成員判定之運算) 以 1=True,  0=False 紀錄於記憶體中 資料判定上,有東西 or 判定為真=True,沒東西( "", [ ], ( ), { }, 0 )or判定為假=False 有邏輯運算 ( and 

Python开发 基礎知識 2.變量 ( *arg, **kwargs )

變量 *args 和 **kwargs ( *和**為本體,名稱為通俗的名稱約定 ) *args 用於函式定義. 可將不定數量的參數傳遞給一個函數,傳入函式的引數,會先以Tuple物件收集,再設定給參數 def test_var_args(f_arg, *arg): print("first normal arg:", f_arg) for arg1 in arg: print("another arg through *argv:", arg1) test_var

Linux # 基礎匯總

主題彙總: Linux 輸入法/裝機軟件/rpm 安装 Linux 輸入法: 註:安裝了sougou後,切換很方便,shift直接漢英切換 Linux 修改键盘设置_helengreens_新浪博客 http://blog.sina.com.cn/s/blog_5445585e0100ophj.html Linux设备配置之键盘配置 - 51CTO.COM http://os.51cto.com/art/201101/243342.htm 裝機軟件 http://www.onlinedown.n

Linux基礎命令——cut

cut的工作就是"剪",具体的说就是在文件中负责剪切数据用的.cut是以每一行为一个处理对象的,这种机制和sed是一样的 (1)其语法格式为:cut  [-bn] [file] 或 cut [-c] [file]  或  cut [-df] [file] 主要参数 -b :以字节为单位进行分割.这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志. -c :以字符为单位进行分割. -d :自定义分隔符,默认为制表符. -f  :与-d一起使用,指定显示哪个区域. 註解:cut 命