1. 找到一個本進程沒有使用的文件描述符fd(int型)
2. 分配一個全新的struct file結構體
3. 根據傳人的pathname查找或建立對應的dentry
4. 建立fd到這個struct file結構體的聯繫 WORD裡面的目錄複製過來似乎不能直接用。。
還是放在這裡當主線看吧.. 用戶空間的Open函數在內核裡面的入口函數是sys_open 通過grep open /usr/include/asm/unistd_64.h查找到的 #define __NR_open 2 __SYSCALL(__NR_open, sys_open) 觀察unistd_64.h,我們可以猜測用戶空間open函數最終調用的系統調用號是2來發起的sys_open系統調用(畢竟glibc一般的做法都會做,用戶空間的函數名字和內核空間中調用的很像,如果需要得到非常準確的,請查看glibc源碼找到對應的系統調用號,再和內核裡面的系統調用號去一一對比)。這裡我們不糾結。 Sys_open函數內容 通過前面的Linux 編程中的API函數和系統調用的關係 我們得知,sys_open實際就是下面這個函數(fs/open.c中) SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode) { long ret; if (force_o_largefile()) flags |= O_LARGEFILE; ret = do_sys_open(AT_FDCWD, filename, flags, mode); /* avoid REGPARM breakage on x86: */ asmlinkage_protect(3, ret, filename, flags, mode); return ret; } 其中先調用force_o_largefile()來判斷是否需要設置大文件標識,然後調用do_sys_open來完成具體的工作。其中 force_o_largefile() 在IA64系統中 arch/ia64/include/asm/fcntl.h,定義如下 #define _ASM_IA64_FCNTL_H #define force_o_largefile() (personality(current->personality) != PER_LINUX32) #include
[admin via ] 在unix中open系統調度絕對需要嗎已經有779次圍觀