?? open.c
字號:
/* * linux/lib/open.c * * open()系統調用用于將一個文件名轉換成一個文件描述符。當調用成功時,返回的文件描述符
* 將是進程沒有打開的最小數值的描述符。該調用創建一個新的打開文件,并不與任何其它進程
* 共享。在執行exec函數時,該新的文件描述符將始終保持著打開狀態。文件的讀寫指針被設置
* 在文件開始位置。參數flag 是0_RDONLY、O_WRONLY、O_RDWR 之一,分別代表文件只讀打開、只
* 寫打開和讀寫打開方式,可以與其它一些標志一起使用。(參見fs/open.c,138 行) */#include <set_seg.h>
#define __LIBRARY__#include <unistd.h>// Linux 標準頭文件。定義了各種符號常數和類型,并申明了各種函數。
// 如定義了__LIBRARY__,則還包括系統調用號和內嵌匯編_syscall0()等。#include <stdarg.h>// 標準參數頭文件。以宏的形式定義變量參數列表。主要說明了-個
// 類型(va_list)和三個宏(va_start, va_arg 和va_end),用于
// vsprintf、vprintf、vfprintf 函數。
//// 打開文件函數。
// 打開并有可能創建一個文件。
// 參數:filename - 文件名;flag - 文件打開標志;...
// 返回:文件描述符,若出錯則置出錯碼,并返回-1。int open(const char * filename, int flag, ...){ register int res; va_list arg;
// 利用va_start()宏函數,取得flag 后面參數的指針,然后調用系統中斷int 0x80,功能open 進行
// 文件打開操作。
// %0 - eax(返回的描述符或出錯碼);%1 - eax(系統中斷調用功能號__NR_open);
// %2 - ebx(文件名filename);%3 - ecx(打開文件標志flag);%4 - edx(后隨參數文件屬性mode)。 va_start(arg,flag);
res = va_arg(arg,int);
_asm{
mov eax,__NR_open
mov ebx,filename
mov ecx,flag
mov edx,res
int 0x80
mov res,eax
}/* __asm__("int $0x80" :"=a" (res) :"0" (__NR_open),"b" (filename),"c" (flag), "d" (va_arg(arg,int)));*/
// 系統中斷調用返回值大于或等于0,表示是一個文件描述符,則直接返回之。 if (res>=0) return res;
// 否則說明返回值小于0,則代表一個出錯碼。設置該出錯碼并返回-1。 errno = -res; return -1;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -