❶ linux環境編程——打開文件、open 介紹、open 源碼、文件描述符 fd 與文件管理結構 file
Linux環境編程——open函數介紹及文件描述符fd與文件管理結構file
一、open函數介紹
在Linux環境中,open函數是用於打開文件的系統調用介面。盡管在C語言標准中不支持函數重載,但在Linux的glibc庫中,open函數通過變參的方式實現了兩個函數原型:
實際上,Linux內核只提供了一個系統調用對應上述第二個函數原型。glibc庫提供了一個變參的open函數,根據傳入的參數個數來決定調用哪個原型,並最終通過系統調用介面與內核進行交互。
二、open函數參數說明
pathname:表示要打開的文件路徑。
flags:用於指示打開文件的選項,常用的有:
O_RDONLY:只讀打開文件。
O_WRONLY:只寫打開文件。
O_RDWR:讀寫方式打開文件。
注意:這三個選項必須有且只能有一個被指定。在Linux環境中,O_RDONLY被定義為0,O_WRONLY被定義為1,而O_RDWR被定義為2,這種設計是為了兼容以前的程序。
除了以上三個選項,Linux還支持更多的選項,如:
O_APPEND:每次進行寫操作時,內核都會先定位到文件尾,再執行寫操作。
O_ASYNC:使用非同步I/O模式。
O_CLOEXEC:在打開文件的時候,就為文件描述符設置FD_CLOEXEC標志,用於解決在多線程下fork與用fcntl設置FD_CLOEXEC的競爭問題。
O_CREAT:當文件不存在時,就創建文件。
O_DIRECT:對該文件進行直接I/O,不使用VFS Cache。
O_DIRECTORY:要求打開的路徑必須是目錄。
O_EXCL:該標志用於確保是此次調用創建的文件,需要與O_CREAT同時使用;當文件已經存在時,open函數會返回失敗。
O_LARGEFILE:表明文件為大文件。
O_NOATIME:讀取文件時,不更新文件最後的訪問時間。
O_NONBLOCK、O_NDELAY:將該文件描述符設置為非阻塞的(默認都是阻塞的)。
O_SYNC:設置為I/O同步模式,每次進行寫操作時都會將數據同步到磁碟,然後write才能返回。
O_TRUNC:在打開文件的時候,將文件長度截斷為0,需要與O_RDWR或O_WRONLY同時使用。
mode:只在創建文件時需要,用於指定所創建文件的許可權位(還要受到umask環境變數的影響)。
三、open函數源碼跟蹤
在Linux內核中,open函數的實現涉及多個步驟,主要包括對傳入參數的合法性檢查、申請新的文件描述符、申請新的文件管理結構file、以及將文件描述符與文件管理結構對應起來等。
參數檢查與轉換:內核會對傳入的flags進行合法性檢查,並根據mode生成新的flags值。
申請新的文件描述符:內核通過get_unused_fd_flags函數申請一個新的、未使用的文件描述符。該函數會盡量返回最低的未使用的文件描述符,以符合POSIX標准。
申請新的文件管理結構file:通過do_filp_open函數申請一個新的文件管理結構file,該結構用於內核對文件的內部管理。
文件描述符與文件管理結構對應:通過fd_install函數將文件描述符與文件管理結構對應起來,這樣用戶就可以通過文件描述符與內核進行交互了。
四、文件描述符fd與文件管理結構file
在Linux內核中,文件描述符fd是一個整數,用於標識一個打開的文件。而文件管理結構file是內核用於管理文件的一個數據結構,包含了文件的各種信息,如文件指針、文件狀態標志、文件操作函數指針等。
當用戶通過open函數打開一個文件時,內核會為用戶分配一個文件描述符,並創建一個文件管理結構來管理該文件。然後,內核將文件描述符與文件管理結構對應起來,這樣用戶就可以通過文件描述符來操作文件了。
當用戶與內核交互時,內核會根據文件描述符從文件管理結構中找到對應的文件,並執行相應的操作。例如,當用戶讀取文件時,內核會根據文件描述符找到對應的文件管理結構,然後調用該結構中的讀操作函數來讀取文件內容。
綜上所述,open函數在Linux環境編程中扮演著重要的角色,它為用戶提供了打開文件的介面,並涉及到文件描述符的申請、文件管理結構的創建以及它們之間的對應關系。通過深入理解open函數的實現原理,我們可以更好地掌握Linux環境下的文件操作。
❷ 如何查看linux進程
Linux 查看進程和刪除進程
1. 在 LINUX 命令平台輸入 1-2 個字元後按 Tab 鍵會自動補全後面的部分回(前提是要有這答個東西,例如在裝了 tomcat 的前提下, 輸入 tomcat 的 to 按 tab)。
2. ps 命令用於查看當前正在運行的進程。
grep 是搜索
例如: ps -ef | grep java
表示查看所有進程里 CMD 是 java 的進程信息
ps -aux | grep java
-aux 顯示所有狀態
ps
3. kill 命令用於終止進程
例如: kill -9 [PID]
-9 表示強迫進程立即停止
通常用 ps 查看進程 PID ,用 kill 命令終止進程
❸ linuxopen文件偏移
通過函數lseek可以改變文件當前的讀寫位置
函數原型
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence)
參數屬性:
offset:表示從文件的whence位置開始偏移的位置大小。
whence:表示文件偏移的位置
有三個選項:
SEEK_SET:表示從文件開始位置偏
SEEK_CUR:表示從文件當前的讀寫位置偏
SEEK_END:表示從文件的結束位置偏移seek.。
int main
//打開文件
int fd = open("b.bat",O_CREAT|O_RDWR);
if(fd == -1)
perror("錯誤:"),exit(-1);
//准備數據
char *str = "abcdefghigklmn";
//寫入數據
write(fd,str,strlen(str));
//准備空間
char buf[32] = {0};
//將文件的讀寫位置移動到文件的開始
lseek(fd,0,SEEK_SET);
//讀取5個位元組的數據
read(fd,buf,5);
//輸出
puts(buf);
//關閉文件
close(fd);
文件偏移量的移動時機:
1、lseek主動移動偏移量
2、read會移動偏移量
3、write會移動偏移量
進程 --》運行--》進程在內存中存在一個進程表項(文件表) //文件表在內核管理的內存空間中
文件最開始運行時,有三個「文件描述符」已經打開:0,1,2
當使用open函數打開一個文件的時候,系統就會創建一個文件表
文件表的內容:
1、文件狀態標志:O_RDONLY \O_WRONLY...
2、文件偏移量(剛打開的文件偏移量為0)
3、V節點指針:指向「v節點表」 //V節點表(磁碟的文件系統上):V節點信息、I節點信息、文件大小