C語言實現linux pwd命令

2021-07-30 06:35:14 字數 3046 閱讀 5242

通過實現linux的pwd命令,以理解linux檔案系統的基本概念一集內部實現,並熟悉linux系統與檔案系統相關的系統呼叫介面。

引自實驗樓課程 [c語言實現linux pwd命令] 侵刪

知識點:

pwd命令的用處是輸出當前工作目錄的絕對路徑,可以不帶任何引數直接使用。

/*

* 檔名: mypwd1.c

* 描述:通過系統函式getcwd實現pwd命令

*/#include

#include

#include

int main(void)

else

return

0;}

雖然這段**實現了pwd的功能,但是卻依然無法為我們解答pwd是如何工作的。

要了解pwd是如何工作的,我們還必須先了解linux中對於檔案目錄的組織方式開始。

在linux中的檔案系統中,檔案=n(n>=1)個inode+m(m>=1)個資料塊

資料塊,存放檔案的內容資料,資料塊的數目根據檔案內容大小而定。

inode成為資訊節點,有兩個作用:

儲存根檔案線管的屬性資訊,如修改時間、所有者、檔案型別和檔案長度,並沒有檔名

儲存指向檔案內容資料塊的指標資訊。

在乙個檔案系統中,乙個inode代表乙個檔案,並使用乙個整數值來表示該inode,成為inode-number,該值對於乙個檔案系統而言是唯一的,即通過該值可以找到其對應的inode。一般情況下,乙個檔案只有乙個inode資訊來描述它。

下面通過一段程式來獲取某個檔案的inode資訊:

*  檔名:filestat.c

* 描述:列印指定檔名的inode資訊

*/#include

#include

#include

#include

#include

#include

struct stat file_stat;

void print_file_stat(struct stat

*fs)

int main(int argc, char* argv)

if (0 != stat(argv[1], &file_stat))

print_file_stat(&file_stat);

return

0;}

在linux系統中,檔案系統通過目錄「包含」子目錄及檔案的方式,來組織成乙個樹狀結構。那麼目錄是如何「包含」其他目錄及檔案的呢?

目錄,在linux中,其實也是一種檔案,所以它也是由「inode+資料塊」構成的。而氣溫件內容是乙個列表,每乙個列表記錄「inode-number+filename」。

因此,我們通常所說的目錄a「包含」檔案b,其實現層面上的意思是,目錄a的內容列表裡有乙個關於檔案b的列表項,即「b的inode-number+b的filename」。

綜上,linux中,乙個檔案(包括目錄)的檔名,及檔名與inode的對應關係,都是由包含該檔案的目錄所描述的。

下面的例子,掩飾了如何列印指定目錄的內容列表:

/*

* 檔名:directorylist.c

* 描述:列印指定目錄的內容列表

*/#include

#include

#include

#include

int main(int argc, char *argv)

dir *dp = null;

struct dirent *dptr = null;

if (null == (dp = opendir(argv[1]))) else

closedir(dp);

}return

0;}

實現思路:

1. 通過特殊的檔名」.」獲取當前目錄的inode-number(假設當前目錄為a)

2. 通過特殊的檔名」..」獲取當前目錄的父級目錄的inode-number

3. 判斷當前目錄和上級目錄的inode-number是否一樣

4. 如果兩個inode-number一樣說明達到根目錄,輸出完整路徑,退出程式

5. 如果兩個inode-number不一樣,切換至父級目錄,根據步驟1獲取的inode-number,在父級目錄中搜尋對應的檔名並記錄下來,然後重新回到步驟1

實現**:

/*

* 檔名:mypwd.c

* 描述:實現簡單的pwd命令

*/#include

#include

#include

#include

#include

#include

#include

/*根據檔名獲取檔案inode-number*/

ino_t get_ino_byname(char *filename)

return file_stat.st_ino;

}/*根據inode-number ,在當前目錄中查詢對應的檔名*/

char* find_name_byino(ino_t ino)

else

}closedir(dp);

}return filename;

}/*限制最大的目錄深度*/

#define max_dir_depth (256)

int main(int argc, char *argv)

}/*輸出完整路徑名*/

int i = current_depth-1;

for (i = current_depth-1; i>=0; i--)

fprintf(stdout, "%s\n", current_depth==0?"/":"");

return

0;}

《unix環境高階程式設計》

linux pwd指令C實現

課程上半部分 ls l命令 檔案屬性 rwx rwx r x 其中 代表沒許可權 檔案硬連線數 乙個檔案的乙個或多個檔名 或目錄子目錄數,目錄的該字段至少是2 所有者所屬使用者組 檔案大小 檔案最後修改時間 檔名課程下半部分 從磁碟到分割槽,分割槽可看作是磁碟 從磁碟到序列塊 塊陣列 位元組陣列 塊...

C語言實現ping命令(一)

ping命令使用到了網路中的icmp協議 關於icmp介紹看這裡 網路位址資訊 struct sockaddr in struct in addr struct in addr define in addr t uint32 t 無符號整型32位 還可以使用以下結構體 struct sockaddr...

使用C語言實現Linux命令cat

cat是乙個linux之中的文字內容檢視工具,實現的方式很容易,就是把檔案之中的 每乙個字元的顯示到螢幕上面。實現檔案檢視器 cat 將文字檔案的字元,乙個乙個的顯示到命令提示符上面 include include include int main int argc,char ar char fil...